(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这句话只是调用了运算符重载函数,所以这句话中的=号是赋值。

最新文章

  1. pyquery的问题
  2. linux允许80端口通过
  3. gulp-notify处理报错----gulp系列(二)
  4. 简明Vim练级攻略(转载)
  5. nginx 完全关闭 access_log
  6. Collections.sort(List&lt;T&gt; Comparator) 自定义排序
  7. mysql中实现oracle中的rowid功能
  8. SharpZipLib 压缩后传输给第三方平台无法识别问题
  9. H5API——Canvas
  10. redis 用setbit(bitmap)统计活跃用户
  11. Bridge实现
  12. 转 jquery 学习笔记
  13. 《C++ Primer》之面向对象编程(二)
  14. Java学习之旅基础知识篇:数组及引用类型内存分配
  15. HTML基础知识(未完待续)
  16. .NET Core RSA密钥的xml、pkcs1、pkcs8格式转换和JavaScript、Java等语言进行对接
  17. 002-如何理解Java的平台独立性
  18. Python虚拟环境的安装与使用
  19. Java入门篇(五)——字符串/String类
  20. 【ORACLE】 安装需要注意的问题(一)

热门文章

  1. 1.mybatis实战教程mybatis in action之一开发环境搭建
  2. location 对象属性
  3. jetty异常
  4. Java对字符串使用MD5进行加密(亲测有效)
  5. 系统批量运维管理器pexpect的使用
  6. lucene教程--全文检索技术
  7. SVM支持向量机推导,工具介绍及python实现
  8. WEB性能测试工具
  9. Linux就业技术指导(六):天津IDC机房项目实践
  10. samtools 的应用