(1)转换构造函数

转换构造函数的定义:转换构造函数就是把普通的内置类型转换成类类型的构造函数,这种构造函数只有一个参数。只含有一个参数的构造函数,可以作为两种构造函数,一种是普通构造函数用于初始化对象,一种是转换构造函数

 //test.h
#ifndef TEST_H
#define TEST_H
class Test{
int m_i;
public:
Test(int i = );//转换构造函数,也是普通构造函数
~Test(); };
#endif //TEST_H //test.cpp
#include"Test.h"
#include<iostream>
using std::cout;
using std::endl; Test::Test(int i) :m_i(i){
cout << "Test(int i):" <<"m_i="<<m_i<< endl;
}
Test::~Test(){
cout << "~Test()" << endl; } //demo.cpp #include<iostream>
#include"Test.h"
int main(){
Test t();//此时调用普通构造函数,初始化t
t = ;//此时调用转换构造函数把15转换成类对象,生成临时对象 return ; }

在上面的t=15这段代码中,会生成临时对象,那么临时对象是什么时候释放的呢?

#ifndef TEST_H
#define TEST_H
class Test{
int m_i;
public:
Test(int i = );
~Test(); };
#endif //TEST_H #include"Test.h"
#include<iostream>
using std::cout;
using std::endl; Test::Test(int i) :m_i(i){
cout << "Test(int i):" <<"m_i="<<m_i<< endl;
}
Test::~Test(){
cout << "~Test()" << endl; } #include<iostream>
#include"Test.h"
int main(){
Test t();//调用构造函数,执行Test(int i):m_i=12
t = ;//生成临时对象,调用转换构造函数Test(int i):m_i=15,当把临时对象赋值给t后,里面调用了析构函数,把m_i值为15的临时对象释放掉
 Test t2;//调用默认构造函数,Test(int):m_i=0;  然后调用析构函数把t和t2对象释放
return ; }

类的构造函数只有一个参数是非常危险的,因为编译器可以使用这种构造函数把参数的类型隐式转换为类类型。所以有时候我们在构造函数的前面加一个关键字explicit,这样普通的内置类型就不能隐式的转换成类对象了。

赋值运算符和初始化的区别:

 //在类里面加入如下的函数,对赋值运算的重载
const Test& Test::operator=(const Test& vt){
m_i = vt.m_i;
return *this;
} #include<iostream>
#include"Test.h"
int main(){
Test t();//此时只会调用构造函数
t = ;//会调用构造函数构造生成临时对象,临时对象向t赋值时,会调用=号的重载函数 Test t2=;//此时只会调用构造函数,没有调用=号的重载函数
t2 = t;//调用=号重载,此时的=号是赋值运算符。
return ; }

根据设置断点实验,跟踪运算符重载函数和构造函数可以看到,t=15这句话是先调用构造函数,然后再调用运算符重载函数,说明是先生成临时变量,然后把临时变量赋值给t,Test t2=9这句话只调用了构造函数,所以这句话属于初始化,t2=t这句话只是调用了运算符重载函数,所以这句话中的=号是赋值。

构造函数constructor 与析构函数destructor(二)的更多相关文章

  1. 构造函数constructor 与析构函数destructor(五)

    我们知道当调用默认拷贝构造函数时,一个对象对另一个对象初始化时,这时的赋值时逐成员赋值.这就是浅拷贝,当成员变量有指针时,浅拷贝就会在析构函数那里出现问题.例如下面的例子: //test.h #ifn ...

  2. 构造函数constructor 与析构函数destructor(四)

    拷贝构造函数:拷贝构造函数就是在用一个类对象来创建另外一个类对象时被调用的构造函数,如果我们没有显示的提供拷贝构造函数,编译器会隐式的提供一个默认拷贝构造函数. 拷贝构造函数的定义是X(const X ...

  3. 构造函数constructor 与析构函数destructor(一)

    构造函数定义:构造函数c++中在创建对象时自动调用,用来初始化对象的特殊函数. (1)构造函数的名字必须与类的名字相同,不能有返回值,哪怕是void 也不行. (2)通常情况下构造函数应声明为公有函数 ...

  4. 构造函数constructor 与析构函数destructor(三)

    (1)构造函数初始化列表: 1 class Test{ 2 int i; 3 public: 4 Test(int vi):i(vi){}//这里的从冒号开始,到右大括号结束,这一段是构造函数初始化列 ...

  5. GCC的__attribute__ ((constructor))和__attribute__ ((destructor))

    通过一个简单的例子介绍一下gcc的__attribute__ ((constructor))属性的作用.gcc允许为函数设置__attribute__ ((constructor))和__attrib ...

  6. javascript工厂函数(factory function)vs构造函数(constructor function)

    如果你从其他语言转到javascript语言的开发,你会发现有很多让你晕掉的术语,其中工厂函数(factory function)和构造函数(constructor function)就是其中的一个. ...

  7. C++笔记----构造函数与析构函数(二)

    构造函数是一种特殊的成员函数.在创建对象的时候自动调用,对对象的数据成员进行初始化. (1)栈区中创建的对象,在生存期结束的时候会自动调用析构函数. (2) 在堆上创建的对象,要由程序员显示调用del ...

  8. 从零开始学C++之构造函数与析构函数(二):初始化列表(const和引用成员)、拷贝构造函数

    一.构造函数初始化列表 推荐在构造函数初始化列表中进行初始化 构造函数的执行分为两个阶段 初始化段 普通计算段 (一).对象成员及其初始化  C++ Code  1 2 3 4 5 6 7 8 9 1 ...

  9. 【转】c++析构函数(Destructor)

    创建对象时系统会自动调用构造函数进行初始化工作,同样,销毁对象时系统也会自动调用一个函数来进行清理工作,例如释放分配的内存.关闭打开的文件等,这个函数就是析构函数. 析构函数(Destructor)也 ...

随机推荐

  1. OpenACC 计算规约时发现的小坑

    ▶ 使用 OpenACC 的 parallel 构件来计算规约,主要想说的是 win10 pgi 和 win10 WSL pgi 结果的不同和关于 for 循环的一个小坑 ● 正常的代码 #inclu ...

  2. 马尔可夫毯(Markov Blanket)

    马尔可夫毯(Markov Blanket) 最近接触到马尔可夫毯(MarkovBlanket)这个概念,发现网上资料不多,通俗易懂的解释甚少,查了一些资料后,决定写一个总结. 提到马尔可夫毯,就会有一 ...

  3. saltstack安装配置及常用命令

    1.salt安装及配置详解 https://www.cnblogs.com/lgeng/p/6567424.html centos7配置: https://www.jianshu.com/p/4c91 ...

  4. ajax 遍历json一维数组

    $.each(data,function(index,value){}data必须是Object类型index是数组的下标value可以是一个对象 function myonclick() { var ...

  5. 笔记本 T450的鼠标经常不灵

    T450的鼠标经常不灵,鼠标总感觉有延迟. 换了鼠标也是这样. 有人反应说是USB断电, 使用的是省电模式,在设备管理>鼠标>电源选项>节电模式 勾去掉就可以了, 但是我的节点模式是 ...

  6. python 网页爬虫,下载网络图片

    # coding=utf-8 import lxml,bs4,re,requests csvContent='' file = open('D:\\tyc_demo.html','rb') soup ...

  7. HttpClient post封装

    /** * @title HttpUtils * @description post请求封装 * @author maohuidong * @date 2017-12-18 */ public sta ...

  8. dp-最长公共子序列

    最长公共子序列(NYOJ36) 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列.tip:最长公 ...

  9. Java8 Map的遍历方式

    在这篇文章中,我将对Map的遍历方式做一个对比和总结,将分别从JAVA8之前和JAVA8做一个遍历方式的对比,亲测可行. public class LambdaMap { private Map< ...

  10. Linux 软件 安装到 /usr,/usr/local/ 还是 /opt 目录

    Linux 的软件安装目录是也是有讲究的,理解这一点,在对系统管理是有益的 /usr:系统级的目录,可以理解为C:/Windows/,/usr/lib理解为C:/Windows/System32./u ...