C++周总结
一、this指针(返回对象本身,解决重名冲突)
- 没什么好说的,就是一个指针,引用对象自身的数据,要用 -> 符号获取,比如:
this->age = age;
- 另外,可以返回this本身对象,实现链式操作
1. Person& AddPerson(Person p)
{
this->age += age;
return *this;
}
P1.AddPerson(10).AddPreson(10).AddPerson(10);
二、空指针访问成员函数
- 对象空指针可以访问对象的方法,但是得没有用到this的方法。比如对象里面使用了对象的属性age时候,就相当于是this->age
- 为了保证健壮性,可以这样:
void ABC()
{
if(this == NULL)
{
return;
}
cout << name <<endl;
}
三、const修饰成员函数,对象
- 常函数:
- 不能修改成员属性
- 但是成员加了mutable就可以了
void ABC() const
{
age = 9;//无法修改
}
int age;
但是
相当于 const Person *const this;的第一个const
void ABC()
{
age = 9;//就可以改了
}
mutable int age;
- 常对象
- 不能修改对象的值,但是加了mutable就可以了
- 常对象只能调用常函数
四、友元(可以访问private)
- 全局函数做友元
把函数声明写在类里面
friend void ABC (Person *p);
- 类做友元
student是被访问的类
写在主动访问的类里
friend class student;
- 成员函数做友元
//告诉编译器 goodGay类中的visit成员函数
//是此类的好朋友,可以访问私有内容
friend void goodGay::visit();
三、重载运算符
//在类里面
Person operator+(const Person &p)
{
}
//在类外
Person operator+(const Person &p1, const Person &p2)
{
}
//
//重载左移运算符,一般在全局函数使用
ostream& operator << (otream& cout, Person &p)
{
return cout;//链式编程思想
}
//
虚函数、抽象类
- 有了纯虚函数就是抽象类,
- 抽象类不能实例化
- 子类必须重写纯虚函数(重写的时候也写了virtual。如果类里面写的声明,实现时候就不用写virtual)
用的多态,父类指针或引用指向子类对象
虚析构
- 如果 类 里面在堆区开辟了空间,需要手动析构
- 子类开辟了堆区空间,父类指针不会调用到子类的虚构函数,
把父类的虚构写成虚析构
纯虚析构
- 父类的纯虚析构要单独实现
- 实现时候不用写virtual
虚函数与多态
当类里面的虚函数时,编译器会自己产生一个虚函数表指针(vptr),里面指向一个虚函数表,表里面记录函数指针。