第三堂课,类和对象(下)

1.对象的初始化列表

1)对象初始化列表出现原因

(1).必须这样做:

如果我们有一个类成员,它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,没有默认构造函数。这时要对这个类成员进行初始化,就必须调用这个类成员的带参数的构造函数,

如果没有初始化列表,那么他将无法完成第一步,就会报错。

(2)、类成员中若有const修饰,必须在对象初始化的时候,给const int m 赋值

当类成员中含有一个const对象时,或者是一个引用时,他们也必须要通过成员初始化列表进行初始化,

因为这两种对象要在声明后马上初始化,而在构造函数中,做的是对他们的赋值,这样是不被允许的。

语法规则

Constructor::Contructor() : m1(v1), m2(v1,v2), m3(v3)

{

    

}

注意:

成员变量的初始化顺序与声明的顺序相关,与在初始化列表中的顺序无关

初始化列表先于构造函数的函数体执行

2.构造函数和析构函数的调用顺序和强化

1)当类中有成员变量是其它类的对象时,首先调用成员变量的构造函数,调用顺序与声明顺序相同;之后调用自身类的构造函数
2)析构函数的调用顺序与对应的构造函数调用顺序相反

3)   匿名对象 Class (1) 的生命周期只存在于这一行代码,构造函数中调用构造函数就为产生匿名对象,是危险行为

3.对象的动态建立和释放

1)在软件开发过程中,常常需要动态地分配和撤销内存空间,例如对动态链表中结点的插入与删除。在C语言中是利用库函数malloc和free来分配和撤销内存空间的。C++提供了较简便而功能较强的运算符 newdelete 来取代malloc和free函数。
注意: new和delete是运算符,不是函数,因此执行效率高。

2)   使用类名定义的对象都是静态的,在程序运行过程中,对象所占的空间是不能随时释放的。但有时人们希望在需要用到对象时才建立对象,在不需要用该对象时就撤销它,释放它所占的内存空间以供别的数据使用。这样可提高内存空间的利用率。

3)   在执行new运算时,如果内存量不足,无法开辟所需的内存空间,目前大多数C++编译系统都使new返回一个0指针值。只要检测返回值是否为0,就可判断分配内存是否成功。

代码运用

int main()
{
	int *p1 = new int(10);
	cout << *p1 << endl;
	delete p1;			//释放指针变量

	int *p2 = new int[5];
	for(int i = 0; i < 5; i++)
		cout << p2[i] << endl;
	delete[] p2;		//释放数组的写法

	return 0;
}

new 和 malloc 的区别在于 malloc 分配指针对象的空间时不会调用构造函数,而 new 会调用构造函数。

4.静态成员变量和静态成员函数

静态成员变量

关键字 static 可以用于说明一个类的成员,
    静态成员提供了一个同类对象的共享机制
 把一个类的成员说明为 static 时,这个类无论有多少个对象被创建,这些对象共享这个 static 成员
 静态成员局部于类,它不是对象成员,在类的外部进行初始化

静态成员函数

静态成员函数数冠以关键字static
静态成员函数提供不依赖于类数据结构的共同操作,它没有this指针
在类外调用静态成员函数用 “类名 :: ”作限定词,或通过对象调用
疑难问题:静态成员函数中,不能使用普通变量,只能使用静态成员变量

5. this 指针

1、C++类对象中的成员变量和成员函数是分开存储的。C语言中的内存四区模型仍然有效
2、C++中类的普通成员函数都隐式包含一个指向当前对象的this指针
3、静态成员函数、成员变量属于类
静态成员函数与普通成员函数的区别:
静态成员函数不包含指向具体对象的指针
普通成员函数包含一个指向具体对象的指针

class Test
{
public:
    Test(int a, int b) //---> Test(Test *this, int a, int b)
    {
        this->a = a;
        this-> b = b;
    }

 

6. const 修饰成员函数

void Test::print() const
{
	//m_a++;	//const修饰的函数不能修改成员变量(read-only)
	cout << m_a << endl;
}

 

7. 友元

友元函数

友元函数不是类的内部函数,是一个全局函数,但是可以改变类的私有属性
友元函数破坏了类的封装性

友元类

若B类是A类的友员类,则B类的所有成员函数都是A类的友员函数
友员类通常设计为一种对数据操作或类之间传递消息的辅助类

 

小结

  • 类通常用关键字class定义。类是数据成员和成员函数的封装。类的实例称为对象。
  • 结构类型用关键字struct定义,是由不同类型数据组成的数据类型。
  •  类成员由private, protected, public决定访问特性。public成员集称为接口。
  •  构造函数在创建和初始化对象时自动调用。析构函数则在对象作用域结束时自动调用。
  •  重载构造函数和复制构造函数提供了创建对象的不同初始化方式。
  •  静态成员是局部于类的成员,提供一种同类对象的共享机制。
  • 友员用关键字friend声明。友员是对类操作的一种辅助手段。一个类的友员可以访问该类各种性质的成员。
  • 链表是一种重要的动态数据结构,可以在程序运行时创建或撤消数据元素。

猜你喜欢

转载自blog.csdn.net/qq_42717879/article/details/81198657