构造函数constructor 与析构函数destructor(二)
2024-09-21 12:27:11
(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这句话只是调用了运算符重载函数,所以这句话中的=号是赋值。
最新文章
- pyquery的问题
- linux允许80端口通过
- gulp-notify处理报错----gulp系列(二)
- 简明Vim练级攻略(转载)
- nginx 完全关闭 access_log
- Collections.sort(List<;T>; Comparator) 自定义排序
- mysql中实现oracle中的rowid功能
- SharpZipLib 压缩后传输给第三方平台无法识别问题
- H5API——Canvas
- redis 用setbit(bitmap)统计活跃用户
- Bridge实现
- 转 jquery 学习笔记
- 《C++ Primer》之面向对象编程(二)
- Java学习之旅基础知识篇:数组及引用类型内存分配
- HTML基础知识(未完待续)
- .NET Core RSA密钥的xml、pkcs1、pkcs8格式转换和JavaScript、Java等语言进行对接
- 002-如何理解Java的平台独立性
- Python虚拟环境的安装与使用
- Java入门篇(五)——字符串/String类
- 【ORACLE】 安装需要注意的问题(一)