C++学习记录---(5)类和对象-----对象特性

这一节的内容:构造函数和析构函数、深拷贝和浅拷贝的问题、静态成员、成员变量和成员函数储存位置、this指针、空指针与对象、const修饰成员函数

1.构造函数和析构函数

简单来说构造函数就是用来初始化的,析构函数用来清理。
并且由系统自动调用,创建对象时自动调用构造函数、删除对象时自动调用析构函数。

构造函数:类名()
析构函数: ~类名()
拷贝构造: 类名(const 类名 &变量名)

①构造函数的分类
按照参数:有参构造和无参构造
按照类型:普通构造和拷贝构造

②编译器默认提供:默认构造(无参数)、默认析构(无参数)、默认拷贝构造(拷贝所以值)。
重写了有参构造,编译器不提供默认构造,依然有拷贝构造。
重写了拷贝构造,编译器不提供其他构造。

③拷贝构造在什么时候被调用??
a.使用一个已经创建的对象来初始化另一个新对象。(新对象拷贝老对象所以值)
b.通过值传递对的方式给函数传参数时。(其实就是形参为一个类的时候)
c.以值的方式返回局部对象。(不会返回局部对象,而会拷贝一个新的对象返回)

2.深拷贝和浅拷贝问题

(1)问题:当类中的变量出现在堆区(new、delete),如果直接使用浅拷贝,会导致重复释放操作。因为拷贝后的对象b堆区变量是一个指针,仍然指向被拷贝对象a的堆区地址。当a释放后、b再释放就会报错。
(2)解决:所以引入深拷贝,
例:

class people()
{
public:
	int *age;
	people()//构造函数
	{
		age = new int(11);
	}
	people(const people &p)//拷贝构造函数,自己实现深拷贝、否则系统提供为浅拷贝。
	{
		//age = p.age;//浅拷贝,会报错
		age = new int(*p.age);//分配新的空间,让其age指针指向新的堆空间,并且赋值*p.age
	}
	~people()//析构函数
	{
		if(age != NULL)
		{
			delete age;
			age = NULL;
		}
	}
	
}

3.静态成员

(1)静态变量
所有对象共享一份数据。
(2)静态函数
所有对象共享一份函数、并且静态函数只能访问静态变量。
(3)可以直接通过类名来访问静态成员、当然也可以通过对象来访问。

4.成员变量和成员函数储存位置

(1)成员变量和成员函数分开储存、只有非静态的成员变量才会占用对象的内存。

(2)空对象占用的内存为一个字节,是为了找到空对象占内存的位置。

5.this指针

(1)在类中操作一些函数和变量时,其实前面都有一个 “this->”,只是省略了。
(2)this 指针的本质就是一个指针常量,不能修改。
(3)用法:
a.用来区分形式参数和类中的成员变量。
b.非静态成员函数返回对象本身 return *this。(可用于链式编程 如cout…)
注意: 一定要用 引用的方式 去接收这个return *this,如果不使用引用的话,就相当于使用拷贝构造函数创建了一个新的对象,而不是返回对象本身!!

6.空指针与对象

空指针可以用来访问成员函数,但是一旦用到 this(对象变量等等),就会报错!

7.const修饰成员函数

(1)常函数 语法: void xxx() const
①不可以修改成员的属性
②但是成员属性声明时加上了 “mutable”,该成员属性仍可以修改。

(2)常对象
声明对象前加上const 成为常对象,只能使用常函数,也可以修改加了 “mutable”的变量。

(3)本质
因为this是一个指针常量, this本来为: 类名 * const this;不能修改this的指向。

当用const修饰成员函数时,其相当于把this改为了:const 类名 * const this;既不能修改this的指向,还不能修改this指向的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值