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.<<


一、封装 

二、对象的初始化和清理 

构造函数和析构函数


拷贝构造函数调用时机:

 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.<<

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

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

  • 13
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值