1、类型转换构造函数

(1)定义

只有一个参数,而且不是复制构造函数的构造函数,一般就可以看作是转换构造函数。

当需要的时候,编译系统会自动调用转换构造函数,建立一个无名的临时对象(或临时变量)。

(2)作用:实现类型的自动转换

程序示例分析:

#include<iostream>
using namespace std;
class Complex {
public:
double real, imag;
Complex(int i)//类型转换构造函数
{
cout << "IntConstructor called" << endl;
real = i;
imag = ;
}
Complex(double r, double i)
{
real = r;
imag = i;
}
};
int main()
{
Complex c1(, );
Complex c2 = ;
c1 = ;//9被自动转换成一个临时Complex对象
cout << c1.real << "," << c1.imag << endl;
return ;
}

输出结果:

IntConstructor called
IntConstructor called

2、析构函数

(1)什么是析构函数

名字与类名相同,在前面加‘~’ ,没有参数和返回值,一 个类最多只能有一个析构函数。

析构函数对象消亡时即自动被调用。可以定义析构函数来在对象消亡前做善后工作,比如释放分配的空间等。

如果定义类时没写析构函数,则编译器生成缺省析构函数。缺省析构函数什么也不做。

如果定义了析构函数,则编译器不生成缺省析构函数。

class String {
private:
char* p;
public:
String(int n);
~String();
};
String::~String()
{
delete[]p;
}
String::String(int n)
{
p = new char[n];
}

(2)析构函数和数组

对象数组生命期结束时,对象数组的每个元素的析构函数都会被调用。

class Ctest {
public:
~Ctest() { cout << "destructor called" << endl; }
};
int main() {
Ctest array[];
cout << "End Main" << endl;
return ;
}

输出结果:

End Main
destructor called
destructor called

(3)析构函数和运算符delete

delete 运算导致析构函数调用。

Ctest* pTest;
pTest = new Ctest; //构造函数调用
delete pTest; //析构函数调用
-------------------------------------------------------- -
pTest = new Ctest[]; //构造函数调用3次
delete[] pTest; //析构函数调用3次

若new一个对象数组,那么用delete释放时应该写 [ ]。否则只delete一个对 象(调用一次析构函数)

(4)析构函数在对象作为函数返回值返回后被调用

class CMyclass {
public:
~CMyclass() { cout << "destructor" << endl; }
};
CMyclass obj; //整个程序结束后消亡
CMyclass fun(CMyclass sobj) { //参数对象消亡也会导致析构函数被调用
return sobj; //函数调用返回时生成临时对象返回
}
int main() {
obj = fun(obj); //函数调用的返回值(临时对象)被用过后,该临时对象析构函数被调用
return ;
}

输出结果:

destructor
destructor
destructor

《新标准C++程序设计》3.1.4-3.2(C++学习笔记6)的更多相关文章

  1. 《新标准C++程序设计》2.1-2.3(C++学习笔记3)

    1.结构化程序设计的不足 程序=算法+数据结构 数据结构和变量相对应,算法和函数相对应,算法是用来操作数据结构的. 结构化程序设计中,函数和其所操作的数据结构,没有直观的联系.随着程序规模的增加,程序 ...

  2. 《新标准C++程序设计》4.7-4.9(C++学习笔记17)

    一.重载类型强制转换运算符 在C++中,类型的名字(包括类的名字)本身也是一种运算符,即类型强制转换运算符.类型强制转换运算符是单目运算符,也可以被重载,但只能重载为成员函数,不能重载为全局函数.经过 ...

  3. 《新标准C++程序设计》1.7-1.10(C++学习笔记2)

    1.内联函数(inline关键字) eg.inline int Max(int a,int b) { if(a>b) return a; return b; } 当编译器处理调用内联函数的语句时 ...

  4. 《新标准C++程序设计》4.2-4.3(C++学习笔记13)

    一.重载赋值运算符“=” 赋值运算符“=”要求左右两个操作数的类型是匹配的,或至少是兼容的.有时候希望赋值运算符两边的类型可以不匹配,比如,把一个int类型变量赋值给一个Complex对象,或把一个 ...

  5. 《新标准C++程序设计》3.9-3.10(C++学习笔记11)

    一.C++程序到C程序的翻译 程序示例分析: C++: class CCar { public: int price; void SetPrice (int p); }; void CCar::Set ...

  6. 《新标准C++程序设计》3.6-3.7(C++学习笔记9)

    一.成员对象和封闭类 (1)定义 一个类的成员变量如果是另一个类的对象,就称之为“成员对象”. 包含成员对象的类叫封闭类. (2)封闭类构造函数的初始化列表 在构造函数中添加初始化列表的写法: 类名: ...

  7. 《新标准C++程序设计》3.3-3.4(C++学习笔记7)

    1.构造函数.析构函数和变量的生存期 构造函数在对象生成时会被调用,析构函数在对象消亡时会被调用. 程序示例分析: (1) #include<iostream> using namespa ...

  8. 《新标准C++程序设计》2.4-2.6(C++学习笔记4)

     1.对象的内存匹配 一般来说,在C++中,一个对象占用的内存空间大小等于其成员变量所占用的内存空间的大小之和.(对象只包含成员变量,不包含成员函数) 每个对象都有各自的存储空间.一个对象的某个成员变 ...

  9. 《新标准C++程序设计》1.1-1.6(C++学习笔记1)

    1.cout输出 cout<<待输出项<<待输出项2<<···; 2.cin输入 cin>>变量1>>变量2>>···; 3.C ...

  10. 正确处理类的复合关系------新标准c++程序设计

    假设要编写一个小区养狗管理程序,该程序需要一个“主人”类,还需要一个“狗”类.狗是有主人的,主人也有狗.假定狗只有一个主人,但一个主人可以有最多10条狗.该如何处理“主人”类和“狗”类的关系呢?下面是 ...

随机推荐

  1. 一 SSH整合:Spring整合Struts2的两种方式,struts.xml管理Action&Bean管理Action

    SSH回顾 1 引入jar包 Struts2的jar包 D:\Struts2\struts-2.3.35\apps\struts2-blank\WEB-INF\lib  开发基本包 Struts2有一 ...

  2. jqueery easyui tree把已选中的节点数据拼成json或者数组(非常重要)

    jqueery easyui tree把已选中的节点数据拼成json或者数组 pqxhk10级分类:其他被浏览14次2018.01.19  https://wenda.so.com/q/1535702 ...

  3. 十六、JSONObject与JSONArray使用-不刷新页面做回写显示

    需要导入:json-lib-2.2.2-.jar包 1.json:就是一个键对应一个值,超级简单的一对一关系.对于json嵌套,只要记住符号“:”前是键,符号后是值大括号成对找. String arr ...

  4. Mac安装jdk

    jdk:https://blog.csdn.net/zw235345721/article/details/78702254 mysql:https://www.jianshu.com/p/fd3aa ...

  5. P1435 回文字串(LCS问题)

    题目背景 IOI2000第一题 题目描述(题目链接:https://www.luogu.org/problem/P1435) 回文词是一种对称的字符串.任意给定一个字符串,通过插入若干字符,都可以变成 ...

  6. SpringBoot开发环境要求

    JDK 截止到目前Spring Boot 的最新版本:2.1.8.RELEASE 要求 JDK 版本在 1.8 以上,所以确保你的电脑已经正确下载安装配置了 JDK(推荐 JDK 1.8 版本). 构 ...

  7. memcached 和 redis 性能测试比对

    网上很多关于memcached 和 redis 区别的介绍,大部分都是说redis比memcached支持的数据类型多的话题,而性能比对确很少,我专门针对两者进行了性能测试比对. 测试内容如下: 两者 ...

  8. Censoring「USACO 2015 Feb」

    题目描述 有一个S串和一个T串,长度均小于1,000,000,设当前串为U串,然后从前往后枚举S串一个字符一个字符往U串里添加,若U串后缀为T,则去掉这个后缀继续流程. 输入格式 包含两行,第一行为S ...

  9. mongdb 4.x admin密码忘记,如何 重建admin用户

    在mongo db中,或mongo db cluser中,如果admin密码忘记了,必须按下面的步骤来做.思路为注释掉security认证部分,重启mongo server, 重建admin用户,再打 ...

  10. 运行jar包中的main方法

    java -classpath jar包名.jar 包名.类名