C++编译器对构造函数的影响



C++调用构造函数比较依赖C++编译器:

#include <iostream>
using namespace std;
class T{
        public:
                T(int i){cout<<"Call T(),i="<<i<<endl;}
                //explicit T(int i){cout<<"Call T(),i="<<i<<endl;}
                ~T(){cout<<"Call ~T()"<<endl;}
        private:
                int i;
};
int main(void)
{
        T t1(9);//标准的初始化方式
        T t2 = 9;//古老的C++编译器
        T t3 = T(9);//采用默认的临时对象的拷贝构造函数初始化t3
        return 0;
}

运行结果:

Call T(),i=9
Call T(),i=9
Call T(),i=9
Call ~T()
Call ~T()
Call ~T()

例如定义一个class,为T,T的构造函数只有一个int的参数,采用如下的构造方式都能正常运行:

1.T t(9);

2.T t2= 9;//不同类型哦,首先用5构造一个临时对象,然后在用临时对象对t2进行拷贝构造函数初始化.

3.T t3= T(9);//用一个T的对象初始化t3对象,C++编译器总是默认会提供拷贝构造函数,来用对象初始化同一类型的对象。

以上的三种方式都能正确的编译并且运行。

         关键字explicit可以阻止让c++编译器阻止非正常的复制对对象进行初始化。如果构造函数上前加上explicit ,则在上面的T t2 = 9是编译不通过的。


例子:


<span style="font-size:24px;">perryn@:/data/source/Cpp/demo:g++ demo2.cc 
demo2.cc: In function ‘int main()’:
demo2.cc:14:9: error: conversion from ‘int’ to non-scalar type ‘T’ requested
  T t2 = 9;</span>
         ^


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值