1.c语言和c++打印的一些区别
// #include <stdio.h> // C语言的标准支持
#include <iostream> // C++标准支持 C++的与众不同
using namespace std; // 命名空间 C++ 的特性 (Java语言的内部类)
int main() {
// C++语言面向对象 + 标准特性
// C语言面向过程,函数+结构体
// C++里面可以运行C语言,可以调用C语言,反之 就不行C语言无法运行C++
// 85%以上 都是 用C++去写功能
// C++里面可以运行C语言,可以调用C语言,反之 就不行C语言无法运行C++
printf("c语言的学习\n");
// std::cout << "C++语言的学习" << std::endl;
cout << "C++语言的学习" << endl; // 因为你前面引入了命名空间,省略std::
// endl == \n 都是换行的含义一样
// Kotlin也有操作符重载, Kotlin就是各个语言的精华所在
// << 不是属性里面的运算,操作符重载
cout << "擒龙功" << endl;
cout << "铁头功\n"
<< "金刚腿\n"
<< "铁布衫\n";
return 0;
}
2.c语言常亮与c++语言常量
#include <iostream>
// C语言的常量,是假常量
int main() {
const int number = 100;
// number = 200;
int * numP = &number;
*numP = 10000;
printf("%d\n", number);
return 0;
}
#include <iostream>
// C++语言的常量,其实是真常量
int main() {
const int number = 100;
printf("%d\n", number);
return 0;
}
3.使用引用来交换两个值
// 3.引用的原理与
#include <iostream>
using namespace std;
// 互换两个数
// 指针取地址 互换
// 接收number1/number2的地址,取改地址的值,来完成的互换
void numberChange(int * number1, int * number2) {
int temp = 0;
temp = *number1;
*number1 = *number2;
*number2 = temp;
}
// C++提倡的引用
void numberChange2(int & number1, int & number2) {
// 如果不采用引用,main numberChange2 内存地址是不一样的
// 如果采用引用,main numberChange2 内存地址是一样的,为什么呢?
cout << "numberChange2 " << "n1地址:" << &number1 << " , n2地址:" << &number2 <<endl;
int temp = 0;
temp = number1;
number1 = number2;
number2 = temp;
}
int main() {
int number1 = 10;
int number2 = 20;
cout << "main " << "n1地址:" << &number1 << " , n2地址:" << &number2 <<endl;
// numberChange(&number1, &number2);
numberChange2(number1, number2);
cout << "n1:" << number1 << " , n2:" << number2 << endl;
cout << endl;
// 第一部分,不采用 &
/*int n1 = 999;
int n2 = n1;
cout << &n1 << "---" << &n2 << endl;*/ // 0xffffcbb4---0xffffcbb0
// 第二部分,采用&
int n1 = 999;
int & n2 = n1;
int & n9 = n1;
n2 = 777;
n9 = 9527;
cout << "地址:" << &n1 << "---" << &n2 << endl;
cout << "值:" << n1 << "---" << n2 << endl;
return 0;
}
4.c++常量引用
#include <iostream>
#include <string.h>
using namespace std;
// 代码的统一性
typedef struct {
char name[20];
int age;
}Student;
// 常量引用:Student不准你改 == const Student &
// 插入数据库,Student的信息给插入数据库
void insertStudent(const Student & student) {
// strcpy(student.name, "李元霸"); 不能这样修改
Student student2 = {"刘奋", 43};
// student = student2; 不能这样修改
// 只读的
cout << student.name << "," << student.age << endl;
}
int main() {
// 用户提交的Student数据
Student student = {"张无忌", 30};
insertStudent(student);
return 0;
}
5.c++函数重载
// C++语言的函数重载 是支持的
#include <iostream>
using namespace std;
// Java构造函数 50个字段,我真正使用的,只有6个
// 建造者设计模式 去解决此问题
// int add(int number1, int number2) = number1 + number2; // 这个是KT写法
int add(int number1) {
return number1;
}
int add(int number1, int number2) {
return number1 + number2;
}
// C++重载 == Java重载
int add(int number1, int number2, int number3) {
return number1 + number2 + number3;
}
// 函数重载 二义性
// 默认行参赋值, // KT也有默认行参赋值 优先寻找默认行参赋值的函数, 跟顺序无关
int add(double n1 = 100, int n2 = 200, int n3 = 300, int n4 = 400, bool isOK = 0) {
return 0;
}
int main() {
add(999);
add(999, 777);
add(100, 200, 888);
return 0;
}
6.c++面向对象,定义studnet.h头文件
// 5.C++面向对象。 对象要有一个声明和一个实现
#include "Student.h"
int main() {
// 规范写法:要有 头文件.h .hpp -- 实现文件 .c cpp
std::cout << 1 << std::endl;
// TODO ======= 下面是栈空间
Student student1; // 栈区开辟空间的
// 赋值
student1.setAge(99);
student1.setName("李连杰");
cout << "name:" << student1.getName() << " ,age:" << student1.getAge() << endl;
// TODO ======= 下面是堆空间
Student * student2 = new Student(); // new/delete
// 赋值
student2->setAge(88);
student2->setName("李元霸");
cout << "name:" << student2->getName() << " ,age:" << student2->getAge() << endl;
if (student2)
delete student2; // 必须手动释放堆空间的对象student2
student2 = NULL; // 指向NULL的地址区域
// free(student2); // 不能这样写,不规范,会被鄙视的
return 0;
// 以后我们学习C++的时候,Derry可能没有写头文件,是不规范的,我只是为了讲课
// 真实开发过程中,必须规范来:
// 正规的流程:【xxx.so(C/Cpp的实现代码) 用户拿到xxx.so】, 头文件
} // main函数弹栈后,会释放栈成员 student1
#include <iostream>
using namespace std;
// Student.h 头文件 只写声明,不写实现
class Student {
private: // 下面的代码(成员和函数),都是私有
char * name;
int age;
public: // 下面的代码(成员和函数),都是公开
// set get
void setAge(int age); // 声明函数
void setName(char * age); // 声明函数
int getAge(); // 声明函数
char * getName(); // 声明函数
};
//根据头文件写实现
#include "Student.h"
// 根据 Student.h 头文件 ,写实现
// 和实现头文件那个函数,没有任何关系,相当于另外一个函数
/*void setAge(int age) {
}*/
void Student::setAge(int age) { // 实现函数
// C++对象指向的是一个指针
// -> 调用一级指针的成员
this->age = age;
}
void Student::setName(char * name) { // 实现函数
this->name = name;
}
int Student::getAge() { // 实现函数
return this->age;
}
char * Student:: getName() { // 实现函数
return this->name;
}