一. 语法的升级
1. 引用
& 是C++里新增的引用运算符,引用的本质是起别名,不会额外占用内存空间,当作为函数形参时,取到的是原变量的地址。可以理解为所有 &变量 的地方都可以替换成 *变量,所有对 变量 的赋值操作都将替换成 &变量。
//测试用例
void print(int &a)
{
printf("a:%p\n", &a);
a = 2; //修改a的值
}
int main(int argc, const char *argv[])
{
int a = 1;
int &b = a;
printf("a = %d\na:%p\nb:%p\n", b, &a, &b);
print(a);
printf("a = %d\n", b); //重新打印a的值
return 0;
}
//输出结果
a = 1
a:0xbff6f4e8
b:0xbff6f4e8
a:0xbff6f4e8
a = 2
2. 默认参数
函数形参可以赋予默认值,默认值必须从右向左赋值,否则就会报错
//示例
void a(int a = 5); //正确
void a(int a, int b = 5); //正确
void a(int a = 5, int b); //报错
//测试用例
void print(int a = 2)
{
printf("a = %d\n", a);
}
int main(int argc, const char *argv[])
{
print(1);
print();
return 0;
}
//输出结果
a = 1
a = 2
3. 函数重载
C++与所有面向面向对象的语言一样,支持函数的重载,重载规则为:只要参数、类型甚至参数顺序不同就可以函数重载,否则就不行。
//测试用例
void print(int a, char b)
{
printf("a = %d b = %d\n", a, b);
}
void print(char a, int b)
{
printf("a = %d b = %d\n", a, b);
}
int main(int argc, const char *argv[])
{
int a = 1;
char b = 2;
print(a, b);
print(b, a);
return 0;
}
//输出结果
a = 1 b = 2
a = 2 b = 1
4. 堆内存
C中的堆内存由 malloc() 函数进行分配,由 free() 函数进行释放, C++中的堆内存由 new 关键字进行申请, 由 delete 关键字进行释放。但它们在使用时是完全相同的。
//malloc() -> new
//free() -> delete
//示例
int *p = new int;
delete p;
char *p = new char[10];
delete [] p;
tip:上述释放数组时如果不加 [] 符号,则系统不一定会进行正确的释放,具体感兴趣的可以去测试一下。
2. 类与对象
1. 类的声明
C++中通过 class xx 的方式进行类的定义,类中通过 public 关键字指定对外开放的公共区域,通过 private 关键字只能自身使用的私有区域,未指定访问权限的区域均有私有区域
//测试示例
class A{
public: //公共空间,可以让外部直接访问
void B(void){
a = 10;
}
void C(void);
private: //私有空间,只能由类内部进行访问
int a;
}
void A::C(void){ //外部实现类的成员函数
printf("a = %d\n", a);
}
int main(int argc, const char *argv[])
{
A a;
a.B();
a.C();
return 0;
}
//打印结果
a = 10
2. 类的从成员函数
C++ 类中基本概念
| 术语 | 释义 |
|---|---|
| 成员变量 | 类中定义的变量 |
| 成员函数 | 类中定义的函数 |
| 构造函数 | 和类同名的函数,在类被创建的时候调用 |
| this指针 | 本类指针,即可指向当前类的指针 |
| 析构函数 | ~类名 这种形式的函数,在类被释放的时候调用 |
tip:
构造函数和析构函数都可以被重载
如果构造函数和析构函数没有被人为重写,系统默认是存在这两个函数的,只是什么事情都没有做
关于类变量彼此间赋值,即拷贝构造函数的说明
A x = 10; //隐式调用
A y = x; //拷贝构造函数,系统默认是将私有变量拷贝一份,也就是浅拷贝
A(const A &x) //拷贝构造函数,当成员里有指针累类型的时候,浅拷贝存在很大隐患
3. 常成员和常函数
//C++中推荐使用const来定义常亮,该常亮只能使用初始化表的方法进行初始化
const int a;
//构造函数
A(int data):a(data){
}
//常函数,即该函数不可修改成员变量
void show() const {
}
4. 静态成员
在类中被 static 修饰的函数和变量可以在类被创造前使用
static 变量初始化得在类外
static 变量共享空间,在类被创建前就被创建了,所以可以不依附与类进行操作
5. 友员
在特殊情况下,我也希望有些类可以使用自己的私有成员
如果一个外部函数需要使用私有数据,需要声明为 friend
友元函数
frind void fun();
//fun这个方法可以使用我的私有成员
友元类
fring class B;
//B整个类所有方法都可以使用我的私有成员
友元成员函数
frind void B::show();
//B类里面的show可以使用我的私有成员
注意声明的时候的顺序,例如B里有A的友元
1.声明A类 表示A的存在
2.定义B类,声明是A友元的函数
3.定义A类,声明为B里某函数的友元
4.定义B里的函数
顺序可以理解为,叫手下办事,首先得知道去哪儿办事,
然后让哪个手下去办事,再告诉人家,我具体哪个手下去办事,要让别人认识一下,最后再告诉手下具体干什么。
1235

被折叠的 条评论
为什么被折叠?



