C++day42-----C++98-构造函数,对象的创建与销毁,再谈构造函数

可像定义变量一样在程序中定义对象/对象数组。
可以通过new完成创建对象。
new和malloc的主要区别在于new在创建对象的时候,可以调用其构造函数初始化对象,而malloc仅仅只是申请一片空间。
构造函数:
构造函数参数列表:可以带有默认参数
缺省构造函数:编译器为每一个没有定义过构造函数的类,定义了一个缺省构造函数。
类型转换构造函数:这种构造函数的参数列表中,只有一个值,如果在编译器优化的情况下,直接利用该构造函数创建一个对象;如果编译器没有优化,那么会先创建一个临时对象,然后通过拷贝构造函数初始化。
拷贝构造函数:编译器为每一个没有定义过拷贝构造函数的类,定义了一个缺省拷贝构造函数,功能挺好的,基本不需要用户自己定义。但有特殊情况(这里暂不讨论)。要注意拷贝构造函数发生的时机。1、利用一个对象初始化另一个对象;2、函数直接形式参数以对象的方式传递;3、函数的返回值是对象的形式

十三、类的定义和实例化
1、 定义类的语法一般形式
class/struct 类名:继承方式 基类 …{
访问控制变量符:
类名(形参表):初始化表{//函数体} //构造函数
~类名(void){函数体} //析构函数
返回类型 函数名(形参表){函数体} //成员函数
数据类型 变量名;//成员变量
};

2、 访问控制限定符:影响类中成员的访问位置
1) public:公有成员,在任意位置都可以访问
2) protected:保护成员
3) private:私有成
class默认私有,struct默认公有

//类中的私有成员,不能在类的外面直接访问,但是可以提供公有的函数来间接访问,在该函数中可以对非法数据加以限定控制业务合理性

3、 构造函数(Constructor)
语法:
class 类名{
类名(构造参数表){
负责对象的初始化,即初始化成员变量
} //构造函数
};
1) 函数名和类名相同,没有返回类型
2) 创建对象时,自动调用,不能像普通的成员函数,直接通过对象调用

4、 多文件编程
类的声明和定义分别放在不同的文件中

5、 对象的创建和销毁

1) 在栈区创建单个对象
类名 对象(构造实参表);
类名 对象 = 类名(构造实参表);
注:两种方式等价

2) 在栈区创建对象数组
类名 对象数组[元素个数] = {类名(),…,…};

3) 在堆区创建/销毁单个对象
创建:
类名* 对象指针 = new 类名(构造实参表);
销毁:
delete 对象指针;

4) 在堆区创建/销毁多个对象
创建:
类名* 对象指针 = new 类名[元素个数]{类型(构造实参表),…,…};
销毁:
delete[] 对象指针;

十四、构造函数和初始化表
1 构造函数可以重载,也可以带有缺省参数
eg:
class Student{
public:
Student(const string &name,int age,int no){…}
Student(const string &name = “who?”){…}
}

2 缺省(无参)构造函数
1) 如果一个类,没有定义任何的构造函数,那么编译器会为该类提供一个缺省的无参构造函数。
–>对基本类型的成员变量不做初始化
–>对于类类型的成员变量,会自动调用相应类的无参构造函数来初始化
2) 如果一个类定义了构造函数,无论是否有参数,那么编译器都不会再提供无参的构造函数。

3 类型转换(单参)构造函数
explicit
class 目标类型{
目标类型(源类型){……}
};
可以实现源类型到目标类型的隐式转换
注:可以使用explicit修饰构造函数,强制要求这种转换必须要显式的进行。

4 拷贝(复制)构造函数
1) 语法:
用一个以存在的对象,构造一个同类型的副本对象,会调用该类的拷贝构造函数
class 类名{
类名(const 类名 &…){…}
};
class A{};
A a1;
A a2(a1);//调用拷贝构造函数

2) 如果一个类没有定义拷贝构造函数,那么编译器会为该类提供一个缺省的拷贝构造函数。
class A{};//缺省无参,缺省拷贝
class A{
A(int){}
};//缺省拷贝
class A{
A(int){}
A(A){}
}//没了
class A{
A(A){}
}//没了

-->对基本类型的成员变量,按字节复制
-->对类类型的成员变量(成员子对象),自动调用该类拷贝构造函数来初始化。
注:多数情况下,不需要自己定义拷贝构造函数,因为编译器缺省提供的拷贝构造函数已经很好用了。

3) 拷贝构造函数调用时机
–>用已经定义的对象作为同类型对象的构造实参
–>以对象的形式,向函数传递参数
–>从函数中返回对象(有时会被编译器优化掉)
去除优化选项(-fno-elide-constructors)

猜你喜欢

转载自blog.csdn.net/displayMessage/article/details/80501846