C++中构造函数居然是可以直接调用的
2017-03-05 14:52
561 查看
代码如下
经过编译和运行之后,结果如下:
调用第一个构造函数
调用第二个构造函数
调用析构函数
5
6
调用析构函数
首先要知道:
一、C++编译器可以在没有拷贝构造函数和operator=这两个函数的时候可以自动的生成这两个函数。
二、这两个函数只能是由按位拷贝的语义,因此是浅拷贝,当有指针成员的时候,它只能拷贝指针的数值,而不能拷贝指针指向的内容。因此这两个函数仅仅在某些特定的情况下才可能有效的发挥作用。
代码分析:
在声明test的时候,调用了第一个构造函数,然后在执行到test=A(5)的时候,调用了第二个构造函数,重点就在这里,这里不是test调用了第二个构造函数,实际是编译器生成了一个临时对象,是这个临时对象调用了第二个构造函数。前面提到了,在没有自己写拷贝构造函数和operator=这两个函数的时候,编译器会自动生成,这个时候的拷贝都是浅拷贝,编译器执行A(5)的时候创建了一个临时的对象,然后通过编译器自己生成的operator=函数把这个临时对象的值赋给了test,最后析构这个临时对象。
这里有个值得注意的地方就是这种采用默认拷贝构造和operator=的拷贝和赋值都是浅拷贝,当有指针的时候应当特别注意不能这样使用,容易出现问题。
还有就是这中直接调用构造函数的方式,还有可能造成野指针,例如:
在临时对象消失之后,ptr成为了野指针。
如果想要延长临时对象生存周期,有一种方法是对它进行const引用:
这样只要a存在,由A(5)产生的临时对象就会存在。
#include <iostream> class A{ public: A():a(0),b(0){std::cout<<"调用第一个构造函数"<<std::endl;} A(int x):a(x),b(x+1){std::cout<<"调用第二个构造函数"<<std::endl;} ~A(){std::cout<<"调用析构函数"<<std::endl;} int geta(){ return a; } int getb(){ return b; } private: int a; int b; }; int main() { A test; test = A(5); std::cout<<test.geta()<<std::endl; std::cout<<test.getb()<<std::endl; return 0; }
经过编译和运行之后,结果如下:
调用第一个构造函数
调用第二个构造函数
调用析构函数
5
6
调用析构函数
首先要知道:
一、C++编译器可以在没有拷贝构造函数和operator=这两个函数的时候可以自动的生成这两个函数。
二、这两个函数只能是由按位拷贝的语义,因此是浅拷贝,当有指针成员的时候,它只能拷贝指针的数值,而不能拷贝指针指向的内容。因此这两个函数仅仅在某些特定的情况下才可能有效的发挥作用。
代码分析:
在声明test的时候,调用了第一个构造函数,然后在执行到test=A(5)的时候,调用了第二个构造函数,重点就在这里,这里不是test调用了第二个构造函数,实际是编译器生成了一个临时对象,是这个临时对象调用了第二个构造函数。前面提到了,在没有自己写拷贝构造函数和operator=这两个函数的时候,编译器会自动生成,这个时候的拷贝都是浅拷贝,编译器执行A(5)的时候创建了一个临时的对象,然后通过编译器自己生成的operator=函数把这个临时对象的值赋给了test,最后析构这个临时对象。
这里有个值得注意的地方就是这种采用默认拷贝构造和operator=的拷贝和赋值都是浅拷贝,当有指针的时候应当特别注意不能这样使用,容易出现问题。
还有就是这中直接调用构造函数的方式,还有可能造成野指针,例如:
A* ptr = &A(5);
在临时对象消失之后,ptr成为了野指针。
如果想要延长临时对象生存周期,有一种方法是对它进行const引用:
const A& a = A(5);
这样只要a存在,由A(5)产生的临时对象就会存在。
相关文章推荐
- C++中构造函数居然是可以直接调用的
- C++中构造函数能调用虚函数吗?(答案是语法可以,输出错误),但Java里居然可以
- 可以直接调用构造函数吗??
- c++中非静态函数不能用类名调用,为什么CWnd的成员函数GetDC()可以直接调用啊?
- 【转】C++在构造函数中可以调用另一个构造函数吗
- c++中为什么父类名可以直接调用自己的非静态函数测试例子!(父类名::非静态函数)
- C++中可以在构造函数中调用另一个构造函数吗?
- 牛客网Java刷题知识点之构造函数可以调用一般函数,但是一般函数不可以直接调用构造函数
- C++中构造函数居然是可以直接调用的
- 意外发现在调用Activator.CreateInstance的时候在构造函数处加断点居然可以~~
- 想不到c++调用操作符运算居然也可以这样
- C++中可以在构造函数中调用另一个构造函数吗?
- c++ 直接插入排序算法---数组引用调用,正序,倒序循环,for终止条件还是for可以条件
- Java与C++在构造函数中调用虚函数时的区别
- ASP函数库(全部可以直接调用,非常方便) 3
- C#可以直接调用的Win32API
- ASP函数库(全部可以直接调用,非常方便) 5
- ASP函数库(全部可以直接调用,非常方便) 4
- 从一道题谈C++中构造函数调用构造函数
- C++学习笔记(5)——基类、派生类的构造函数、析构函数的调用顺序