1.引用(起别名,必须初始化且只能初始化一次,必须引用一个合法的内存空间)
用途 参数传递:不改变实参值-》值传递即可
需要改变参数值-》指针传递或者引用传递
注意事项:(1)不要返回局部变量,可以加static成为全局(返回局部变量编译器优化只保存一次)
(2)函数返回的是引用,函数的调用可以作为等号的左值
指针的引用: 用一级指针引用可以代替二级指针
常量引用 : 使用场景 修饰形参为只读防止修改
const int*&a= 10;会分配内存(int &a=10;是编不过的,加const编译器会产生临时变量)2
2.C++语言的封装
(1)事物的属性和行为作为一个整体来表示事物
(2)struct和class唯一的区别是:struct默认权限是public,class默认权限是private
(3)public:类内类外都可以访问到
protected:类内可以,类外不可以(子类可以访问)
private:类内可以,类外不可以(子类不可以访问)
3.构造函数
普通构造函数:有参构造/无参构造
拷贝构造函数:时机 :(1)用已创造好的对象来初始化新的对象
(2)以值的方式给函数传参
(3)以值的方式返回局部对象
(4)realse版本默认会做优化
构造函数的调用规则:(1)提供了有参构造,系统不会提供无参,但提供拷贝构造
(2)提供了拷贝构造,系统不会提供其他任何构造
构造函数的初始化列表(不一定每个属性都得写):person(int a,int , int c):m_a(a) , m_b(b) , m_c©
4.深拷贝与浅拷贝(析构释放空间时会遇到)
浅拷贝:(1)系统提供的拷贝构造,只是进行简单的值拷贝,eg:指针赋值
(2)属性里面有指针指向堆区,简单的浅拷贝会导致空间释放两次
深拷贝:为解决上述问题,需要自己写书深拷贝构造函数。
5.类对象作为类的属性成员时,构造顺序:先构造类对象的构造,然后构造自己的构造。
析构顺序:与构造相反。
6.explicit关键字的作用:防止隐式类型转换。(eg:Mystring str = 10 //构造函数前面加个explicit,此句就会报错)
7.new运算符和delete运算符
(1)所有new出来的对象,返回的是该对象类型的指针 / malloc返回的是void*,还需要强转
(2)new会自己调用构造函数 / malloc不会调用构造函数
(3)new是运算符 / malloc是函数
(4)new配和delete使用 / malloc配合free使用
注意:new出来的数组,释放 delete [] person1
8.static关键字(所有对象共用静态变量和静态函数)
static静态成员变量:(1)static成员变量在编译阶段就分配空间,即在对象还没有创建时,就有了空间
(2)静态成员在类内声明,类外初始化。(通过对象访问,或者通过类名访问)
(3) 有权限限制,即私有静态属性在类外初始化但不可访问 static静态成员函数: (1)静态成员方法,只可访问静态属性,不可访问普通属性(对象有很多,共享函数压根不知道时哪个对象的普通属性)
(2)有权限限制,即私有在类外不可访问
(3)通过类名和对象都可以访问
9.C++对象模型初探
(1)C++成员方法和成员变量时分开存储的
(2)空类的大小为 1
(3)对象的大小只取决于非静态成员,且有对齐原则(sizeof对象时,大小与成员方法,静态成员方法,静态成员变量无关)
10.this指针的使用(对象的指针)
(1)指针永远指向当前对象
(2)解决命名冲突问题
(3)*this为对象本体
11.空指针调用成员函数(Person *p= NULL)
(1)成员函数中没有用到this指针访问对象属性,则可以直接访问。
(2)成员函数中有用到this指针,则加判断 if(p==NULL) return (防止空指针调用)
12.常函数与常对象
常函数 (1)void func()const {}
(2)修饰的时this指针,不能修改this指针指向的属性(mutable 修饰的属性,常函数依然可以修改)
常对象 (1)const Person p
(2)只可以调用常函数
(3)不可以修改对象属性,不可以调用普通函数