大发5分11选5_极速5分3D

C++中explict声明构造函数的作用

时间:2019-12-23 14:45:53 出处:大发5分11选5_极速5分3D

下面以具体实例来说明。建立people.cpp 文件,因此输入下列内容:/*人类,是人的类,全是人类 -:) */class People{public:int age;explicit People (int a){age=a;}};/*并全是法子来 “造人” */void foo ( void ){People p1(10); //法子一People* p_p2=new People(10); //法子二People p3=10; //法子三}这段 C++ 守护进程运行定义了一有一个多多多类 people ,含有一有一个多多多构造函数, 你你是什么构造函数只含有一有一个多多多整形参数 a ,可用于在构造类时初始化 age 变量。因此定义了一有一个多多多函数foo,在你你是什么函数中一点人用并全是法子分别创建了有一个多多多10岁的“人”。 第并全是是最一般的类变量声明法子。第二种法子随便说说是声明了一有一个多多多people类的指针变量,因此在堆中动态创建了一有一个多多多people实例,并把你你是什么实例的地址赋值给了p_p2。第并全是法子而是我 一点人所说的特殊法子,为你你是什么说特殊呢? 一点人都知道,C/C++是并全是强类型语言,不同的数据类型是可不并能了随意转换的,然后要进行类型转换,可不并能进行显式强制类型转换,而这里,可不并能了进行任何显式的转换,直接将一有一个多多多整型数据赋值给了类变量p3。 因此,可不并能说,这里进行了一次隐式类型转换,编译器自动将对应于构造函数参数类型的数据转换为了该类的对象,因此法子三经编译器自动转换后和法子一最终的实现法子是一样的。不相信? 耳听为虚,眼见为实,让一点人看看底层的实现法子。为了更容易比较法子一和法子三的实现法子,一点人对顶端的代码作一点修改,去除法子二:void foo ( void ){People p1(10); //法子一People p3=10; //法子三}去除法子二的由于 是法子二是在堆上动态创建类实例,因此会有一点额外代码影响分析。修改完成后,用下列命令编译 people.cpp$ gcc -S people.cpp"-S"选项是GCC输出汇编代码。命令执行后,默认生成people.s。 关键要素内容如下:.globl _Z3foov.type _Z3foov, @function_Z3foov:.LFB5:pushl %ebp.LCFI2:movl %esp, %ebp.LCFI3:subl $24, %esp.LCFI4:movl $10, 4(%esp)leal -4(%ebp), %eaxmovl %eax, (%esp)call _ZN6PeopleC1Eimovl $10, 4(%esp)leal -8(%ebp), %eaxmovl %eax, (%esp)call _ZN6PeopleC1Eileaveret看“.LCFI4” 行顶端的东西,1-4行和5-8行几乎一模一样,1-4行即为法子一的汇编代码,5-8即为法子三的汇编代码。 细心的你然后发现2和6行有所不同,一有一个多多多是 -4(%ebp) 而原先一有一个多多多是 -8(%ebp) ,这分别为类变量P1和P3的地址。对于不可随意进行类型转换的强类型语言C/C++来说, 这可不并能说是C++的一有一个多多多行态。哦,今天好像全是要说C++的行态,而是我 要知道explicit关键字的作用?explicit关键字到底是你你是什么作用呢? 它的作用而是我 禁止你你是什么行态。如文章一现在然后刚开使而言,凡是用explicit关键字修饰的构造函数,编译时就无需进行自动转换,而会报错。让一点人看看吧! 修改代码:class People{public:int age;explicit People (int a){age=a;}};因此再编译:$ gcc -S people.cpp编译器立马报错:people.cpp: In function ‘void foo()’:people.cpp:23: 错误:请求从 ‘int’ 转换到非标量类型 ‘People’

热门

热门标签