目录
3.实质:隐式转换法,新版本编译器(VS2022)已经不再适用
一、封装
二、对象的初始化和清理
构造函数和析构函数
拷贝构造函数调用时机:
1.
2. 实质:隐式转换法
3.实质:隐式转换法,新版本编译器(VS2022)已经不再适用
构造函数调用规则:
深拷贝与浅拷贝
浅拷贝的问题:
解决方案:深拷贝:
#include <iostream>
using namespace std;
struct Person {
public:
Person(){
cout << "默认无参构造函数" << endl;
}
Person(int age,int height) {
cout << "有参构造函数" << endl;
m_age = age;
m_height = new int(height);
}
Person(const Person &p) {
cout << "拷贝构造函数" << endl;
//如果不利用深拷贝在堆区创建新内存,会导致浅拷贝带来的重复释放堆区问题
m_age = p.m_age;
//m_height=p.m_height
m_height = new int(*p.m_height);
}
~Person() {
cout << "析构函数" << endl;
//析构代码的一个作用:释放堆区内存
if (m_height != NULL) {
delete m_height;
}
}
int m_age;
int* m_height;
};
int main() {
Person p(18,160);
Person p1(p);
cout << p.m_age << ' ' << *p.m_height << endl;
cout << p1.m_age << ' ' << *p1.m_height << endl;
return 0;
}
初始化列表初始化:
类对象作为类成员,构造和析构的顺序:
静态成员
静态成员变量
1.静态成员变量不属于某个对象上,所有对象都共享同一份数据
#include <iostream>
using namespace std;
struct Person {
public:
static int a;
};
int Person::a = 100;
int main() {
Person p1;
cout << p1.a << endl;
Person p2;
p2.a = 200;
cout << p1.a << endl;
return 0;
}
2.静态成员变量的两种访问方式
(1)对象
p1.a
(2)类名
Person::a
3.编译阶段就分配内存
4.类内声明,类外初始化操作
5.静态成员变量也是有访问权限的
静态成员函数
1.所有对象共享同一个函数
2.静态成员函数只能访问静态成员变量
3.两种访问方式:
(1)对象
(2)类名
3.也有访问权限,private在类外访问不到。
三、C++对象模型
Person p;
sizeof(p)=4;
空对象占用内存空间为1字节
四、this指针
Person * const this;
指针常量,其指向不可以被修改。
类中的Person& PersonAddPerson(Person p)函数返回值是引用很关键,如果没有了引用一直返回初始的p2,链式编程实际只会一次有效。
五、空指针访问成员函数
可以提高代码健壮性
六、const修饰成员函数
mutable 加入成员属性后常对象也可以修改它
七、友元
1.全局函数作友元
2.类作友元
3.成员函数作友元
friend void Class::func()
八、运算符重载
1.+
2.<<
通常不使用成员函数重载<<原因:
只能利用全局函数重载<<: