1.默认情况下,编译器会给类至少添加3个构造函数
1)默认构造函数(无参,函数体为空)
2)默认析构参数(无参,函数体为空)
3)默认拷贝构造函数,为所有的属性进行值拷贝。
2.如果我们提供了有参构造函数,编译器不再提供默认构造,但是会提供拷贝构造函数。
3.深拷贝和浅拷贝
1)浅拷贝:默认拷贝构造函数,简单的赋值拷贝。
2)深拷贝:自己实现拷贝构造函数,重新申请堆区空间,进行拷贝操作。防止空间重复释放的问题。析构要配合释放堆区内存。
浅拷贝的问题:
注意:如果成员中有堆区操作,要自己实现拷贝构造函数。
4.初始化列表:用来初始化属性
1)目前觉得用途不大, 以后再看。
5.当其他类对象作为本类成员时,先调用成员类的构造函数,再构造自身;析构的时候相反。
6.静态成员:
1)静态成员变量:
(1)所有对象同共享同一份数据;
(2)在编译阶段分配内存
(3)类内声明,类外初始化。
2)静态成员函数:
(1)所有对象共享同一个函数。可以通过对象,也可以通过类名。
(2)静态成员函数只能访问静态成员变量。
7.C++对象和this
1)成员变量和成员函数是分开存储的。只有非静态成员变量属于类对象。
class Person
{
}
int main
{
Person p;
cout<<"size of ="<<sizeof(p)<<endl;
}
结果是:
(1)1。空对象的结果是1,C++编译器会给每一个空对象分配一个字节空间,是为了区分空对象占内存的位置。
2)this指针
每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码。那么问题是:这一块代码是如何区分哪个对象调用自己的?
C+++通过提供特殊的对象指针,this指针,解决上述问题。this指针指向被调用的成员函数所属的对象。
this指针是隐含每一个非静态成员函数内的一种指针
this指针不需要定义,直接使用即可。
this指针的用途:
(1)当形参和成员变量同名时,可以用this指针来区分;名称冲突问题。
(2)在类的非静态成员函数中返回对象本身,可使用return *this;
8.空指针访问成员函数
9.const修饰成员函数
常函数:
1)成员函数后加const后,我们称这个函数为常函数;
2)常函数内不可以修改成员属性;修饰的时this指向,让指针指向的值也不可以修改。
3)成员属性声明时加关键字mutable后,在常函数中依然可以修改;
常对象:
1)声明对象前加const称该对象为常对象;
2)常对象只能调用常函数
3)成员属性声明时加关键字mutable后,在常对象中依然可以修改;
class Person
{
public:
void showPerson() const
{
m_A=100;//等价于 const Persong * const this ->m_A ,这是不能修改的
m_B=100;//因为成员加了mutable ,可以修改。
}
int m_A;
mutable int m_B;
};
10.友元
1)友元的三种实现
(1)全局函数做友元。将全局函数放在类里。头部加friend。可以访问私有
class Person
{
friend void test(Person &p);
private:
int m_A;
};
void test(Person &p)
{
cout<<p.m_A<<endl;
}
(2)类做友元
(3)成员函数做友元
暂未整理