C++-类和对象

目录

一、封装 

二、对象的初始化和清理 

构造函数和析构函数

拷贝构造函数调用时机:

 1.​编辑

2. 实质:隐式转换法

3.实质:隐式转换法,新版本编译器(VS2022)已经不再适用

构造函数调用规则:

深拷贝与浅拷贝

初始化列表初始化:

​编辑 类对象作为类成员,构造和析构的顺序:

静态成员 

静态成员变量

1.静态成员变量不属于某个对象上,所有对象都共享同一份数据

2.静态成员变量的两种访问方式

(1)对象

(2)类名

3.编译阶段就分配内存

4.类内声明,类外初始化操作

5.静态成员变量也是有访问权限的

静态成员函数

1.所有对象共享同一个函数

2.静态成员函数只能访问静态成员变量

3.两种访问方式:

(1)对象

(2)类名

3.也有访问权限,private在类外访问不到。

三、C++对象模型

四、this指针

五、空指针访问成员函数

六、const修饰成员函数

七、友元

1.全局函数作友元

2.类作友元

3.成员函数作友元

 friend void Class::func()

八、运算符重载

1.+

 2.<<


一、封装 

C++-类和对象_第1张图片

二、对象的初始化和清理 

构造函数和析构函数

C++-类和对象_第2张图片

C++-类和对象_第3张图片


拷贝构造函数调用时机:

 1.C++-类和对象_第4张图片

C++-类和对象_第5张图片

2. 实质:隐式转换法

C++-类和对象_第6张图片

C++-类和对象_第7张图片

3.实质:隐式转换法,新版本编译器(VS2022)已经不再适用


构造函数调用规则:

C++-类和对象_第8张图片

C++-类和对象_第9张图片


深拷贝与浅拷贝

 浅拷贝的问题:C++-类和对象_第10张图片

 解决方案:深拷贝:

#include 
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 
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.静态成员变量也是有访问权限的

C++-类和对象_第11张图片

静态成员函数

1.所有对象共享同一个函数
2.静态成员函数只能访问静态成员变量
3.两种访问方式:
(1)对象
(2)类名
3.也有访问权限,private在类外访问不到。

三、C++对象模型

C++-类和对象_第12张图片

 Person p;

sizeof(p)=4;

空对象占用内存空间为1字节

四、this指针

Person * const this;

指针常量,其指向不可以被修改。

C++-类和对象_第13张图片

 C++-类和对象_第14张图片

C++-类和对象_第15张图片 类中的Person& PersonAddPerson(Person p)函数返回值是引用很关键,如果没有了引用一直返回初始的p2,链式编程实际只会一次有效。

五、空指针访问成员函数

C++-类和对象_第16张图片

C++-类和对象_第17张图片

 可以提高代码健壮性

六、const修饰成员函数

C++-类和对象_第18张图片

C++-类和对象_第19张图片

mutable 加入成员属性后常对象也可以修改它 

七、友元

1.全局函数作友元

C++-类和对象_第20张图片

2.类作友元

3.成员函数作友元

 friend void Class::func()

八、运算符重载

1.+

C++-类和对象_第21张图片

 2.<<

通常不使用成员函数重载<<原因:

C++-类和对象_第22张图片

 只能利用全局函数重载<<:

C++-类和对象_第23张图片

C++-类和对象_第24张图片

你可能感兴趣的:(C++,c++,算法,开发语言)