(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. easyui datagrid列使用按钮的一些心得(转)

    http://blog.csdn.net/sskicgah/article/details/16939959 以前,用easyui的datagrid,有时候会用到一些操作选项,比如代码如下: $('# ...

  2. vsphere使用笔记

    一,安装虚拟机,需要使用vsphere client上传镜像,提示错误:   vsphere client 上传文件:Failed to log into NFC Server   , 解决办法:用浏 ...

  3. DSHTTPService

    DSHTTPService Filters 压缩过滤器的使用 The Filters property specifies the DataSnap communication filters for ...

  4. 机器学习入门-DBSCAN聚类算法

    DBSCAN 聚类算法又称为密度聚类,是一种不断发张下线而不断扩张的算法,主要的参数是半径r和k值 DBSCAN的几个概念: 核心对象:某个点的密度达到算法设定的阈值则其为核心点,核心点的意思就是一个 ...

  5. ABAP-动态创建DATABASE/FUNCTION(风险)

    警告:此程序仅供研究,请谨慎操作,切勿对系统标准数据表及功能函数进行测试(可能无法修复). 程序:EWUCINS REPORT EWUCINS MESSAGE-ID US NO STANDARD PA ...

  6. Python 中的垃圾回收机制(转载)

    from: https://foofish.net/python-gc.html GC作为现代编程语言的自动内存管理机制,专注于两件事:1. 找到内存中无用的垃圾资源 2. 清除这些垃圾并把内存让出来 ...

  7. 四大域对象,和jsp的九大隐式对象,已经el表达式的11个隐式对象

    四大域对象 1.PageContext :页面范围的数据 2.ServletRequest:请求范围的数据 3.HttpSession:回话范围的数据 4.ServletContext:应用范围的数据 ...

  8. delphi 中判断对象是否具备某一属性

    Uses   TypInfo;         {$R   *.dfm}         procedure   TForm1.Button1Click(Sender:   TObject);     ...

  9. js中对话框的使用

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  10. git仓库搬家

    1). 从原地址克隆一份裸版本库 git clone --bare git://xxxxx.com/xxx.git 2). 然后到新的 Git 服务器上创建一个新项目 3). 以镜像推送的方式上传代码 ...