赞
踩
一、类的构造函数及其种类
当我们自定义一个类的时候,需要创建类的构造函数。
1、构造函数的作用:用来初始化对象空间。编译系统在创建类对象的时候,会申请内存空间,然后自动调用类的构造函数,完成对象的初始化操作。
2、构造函数的种类:无参数构造函数(没有参数)、一般构造函数(构造函数有多个不同参数,或者参
数类型不同)、拷贝构造函数(参数是const类型,且参数为类对象本身的引用),拷贝赋值函数(参数是const类型,且参数类型为对象本身的引用,实现的是对=的操作数重载)
如果自定义的类中没有任何构造函数,那么编译系统会自动生成一个默认的无参数构造函数,同时该构造函数什么也不做。但是一旦自己定义了构造函数(不论构造函数中是否有参数,以及参数类型如何),那么系统就不会生成默认的无参数构造函数,即使自己定义了一个无参数构造函数,并在函数体内做了一些操作,那么系统也不会提供默认构造函数。
所以一般定义一个类的时候最好是至少提供以上三种类型的构造函数。尤其是无参数的构造函数,因为一旦创建了另外两种构造函数,那么无参数的构造函数编译系统就不给提供了,此时就不存在无参数构造函数,这样有可能会发生错误。
例如:
class Test{
public:
Test();
Test(const Test& t);
Test& operator=(const Test& t);
~Test();
};
二、类的初始化方式
对象的构造分成两个操作步骤,初始化和执行函数体。
1、构造函数体内赋值
这种情况相当于在执行完了初始化之后,在执行构造函数体内的赋值操作。
2、构造函数的初始化列表初始化
这种情况相当于直接在初始化的时候完成了,初始值设置,不需要在执行赋值操作,所以性能相对高一些。
二、多个类的构造函数
1、单继承
单继承是子类只继承一个父类,父类中的方法和数据成员子类都会继承。
class Father{
public:
Father();
Father(string _name) : name(_name){};
Father(const Father& f);
Father& operator=(const Father& f);
string get_message();
~Father();
private:
string name;
int age;
};
class Child : public Father{
public:
Child();
Child(string _name) : Father(_name){}
string get_message();
};
2、多继承
多继承的时候,子类继承多个父类,会将多个父类的数据和成员函数都继承进来。
3、虚继承
在多继承的时候,会出现重复继承,如,子类继承的父类A和父类B都继承了祖父类M,那么此时在子类中就会存在两个祖父类,此时编译就会出现问题。为了解决这个为题,出现了虚继承,也就是父类A和父类B在继承祖父类M的时候采用虚继承的方式来继承,这样在子类中就会只出现一次,因为采用虚继承,使得继承类似于虚函数一样,子类中存在一个指向虚基类表的指针,而虚基类表中就存放了虚基类的地址。
class Father{
public:
Father();
Father(string _name) : name(_name){};
Father(const Father& f);
Father& operator=(const Father& f);
string get_message();
~Father();
private:
string name;
int age;
};
class Child1 : virtual public Father{
public:
Child1();
Child1(string _name) : Father(_name){}
string get_message();
};
class Child2 : virtual public Father{
public:
Child2();
Child2(string _name) : Father(_name){}
string get_message();
};
class Grande : public Child1,Child2{
public :
Grande();
};
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。