提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
内存四区
代码区
代码区:二进制代码(exe) 特点:共享、只读
全局区:全局变量、静态变量、常量(除了局部变量、局部常量)
栈区:编辑器开辟释放(局部变量、形参)
堆区:程序员分配释放(关键字new将数据开辟到堆区,delete删除)
引用和重载
引用
给变量起别名
数据类型 &别名= 原名;
1.引用必须初始化,且初始化后不可以更改
2.可用于形参修饰实参,进行引用传递
3.引用做函数返回值的话得作为左值
4.引用的本质是指针常量
5.常量引用:const,修饰形参,防止误操作
函数重载
函数名相同,提高复用性
函数重载条件;
1.同一个作用域下
作用域的意思就是有效范围,比如全局作用域(全局可访问),类作用域(类对象可访问),main函数作用域等
2.函数名相同
3.函数参数类型 / 个数 / 顺序不同
p.s.函数返回值不可以作为函数重载条件,即只有返回值类型不同是不行的。
且,注意二义性
对象特性
构造函数和析构函数
构造函数:初始化 ; 析构函数:清理
构造函数:
1.没有返回值,也不用写void
2.函数名与类名相同
3.可以有参数,可以发生函数重载
4.每次创建对象自动调用,且只调用一次
5.不写的话编辑器自动空实现
构造函数 | 析构函数 |
---|---|
没有返回值,也不用写void | 没有返回值,也不用写void |
函数名与类名相同 | 函数名与类名相同,名称前加 ~ |
可以有参数,可以发生函数重载 | 不可以有参数,不可以发生函数重载 |
每次创建对象自动调用,且只调用一次 | 每次销毁对象自动调用,且只调用一次 |
不写的话编辑器自动空实现 | 不写的话编辑器自动空实现 |
class Person
{publlic:
//构造函数进行初始化
Person()
{
cout<<"Person构造函数调用"<<endl;
}
//析构函数进行清理
~Person()
{
cout<<"Person析构函数调用"<<endl;
}
}
void test01()
{
Person p;
}
int main()
{
}
只要创建一个类,C++编译器会给每个类都至少添加三个函数:
1.无参构造函数
2.无参析构函数
3.拷贝构造函数
浅拷贝:简单的赋值拷贝
问题:堆区内存重复释放
深拷贝:在堆区重新申请空间,拷贝操作
静态成员
静态成员变量
static
1.所有对象共享一份数据
2.编译阶段分布内存
3.类内声明,类外初始化
即,静态成员变量,不属于某个对象上,所有对象共享一份数据
访问方式:
//1.通过对象进行访问
Person p;
cout<<p.m_A<<endl;
//2.通过类名进行访问
cout<<Person::m_A<<endl;
静态成员函数
1.所有对象共享一个函数
2.静态成员函数只能访问静态成员变量
访问方式:
//1.通过对象进行访问
Person p;
p.func();
//2.通过类名进行访问
Person::func();
p.s.静态成员函数不能访问非静态成员变量
静态成员变量和静态成员函数也有访问权限,即 private 访问不到
运算符重载
(对于全局函数重载,好像可以理解为传参就是重载运算符左右的变量)
加号重载
Person p3 = p1 + p2;
//成员函数重载
Person operator+ (Person &p)
{
Person temp;
temp.A = this->A + p.A;
temp.B = this->B + p.A;
return temp;
}//Person p3 = p1.operator+(p2);
//全局函数重载
Person operator+ (Person &p1,Person &p2)
{
Person temp;
temp.A = p1.A + p2.A;
temp.B = p2.B + p2.A;
return temp;
}//Person p3 = operator+ (p1,p1);
左移运算符重载
一般不用成员函数重载实现
osream operator<<(ostream &cout, Person p)
{
cout = "A="+ p.A +" B="+ p.B;
return cout;
}//cout<<p<<endl;