//
// main.cpp
// 拷贝构造函数
//
// Created by Eric on 16/7/20.
// Copyright © 2016年 Eric. All rights reserved.
//
#include <iostream>
using namespace std;
/**
* 3.拷贝构造函数调用的三种形式
3.1.一个对象作为函数参数,以值传递的方式传入函数体;
3.2.一个对象作为函数返回值,以值传递的方式从函数返回;
3.3.一个对象用于给另外一个对象进行初始化(常称为复制初始化)。
*/
/**
* 当产生新对象,用已有对象去初始化新对象时才会调用拷贝构造函数
*/
class Location
{
public:
/**
* 含参构造函数
*/
Location(int x = 0,int y = 0){
_x = x;
_y = y;
_myP = (char *)malloc(100);
strcpy(_myP, "adfadaf");
cout<<"Constructor Object.\n";
}
Location(const Location &obj){
cout<<"调用拷贝构造函数 \n";
}
/**
* 析构函数
*/
~Location(){
cout<<_x<<","<<"Object destroryed"<<endl;
if (_myP != NULL) {
free(_myP);
}
}
int getX(){
return _x;
}
private:
int _x,_y;
char *_myP;
};
class A{
A(int a){
_a = a;
};
private:
int _a;
};
Location createLocation(){
Location L(10,20);
printf("---->%p\n",&L);
return L;
}
void testFunction(){
createLocation();
}
void testFunction2(){
Location a = createLocation();
printf("---->%p\n",&a);
printf("对象被扶正:m:%d\n",a.getX());
}
void testFunction3(){
Location B(5,2);
//
Location C = B;
printf("C:m:%d\n",C.getX());
}
void testFunction4(){
Location B(5,2);
//
Location C(19,20);
C = B;
printf("C:m:%d\n",C.getX());
}
int main(int argc, const char * argv[]) {
// insert code here...
std::cout << "Hello, World!\n";
// testFunction();
// testFunction2();
// testFunction3();//内存泄露 显示的调用了内存拷贝函数
testFunction4();//内存泄露 隐式的调用了内存拷贝函数
//
// Location D;
//
// D = B;
return 0;
}
关键总结:
当产生新对象,用已有对象去初始化新对象时才会调用拷贝构造函数
网友评论