码迷,mamicode.com
首页 > 编程语言 > 详细

C++拷贝构造函数专题

时间:2017-10-01 23:06:30      阅读:323      评论:0      收藏:0      [点我收藏+]

标签:3.1   结果   def   测试   span   编译   fine   void   技术   

C++拷贝构造函数

       在定义任何C++类时,拷贝空置操作都是必要部分,类需要控制拷贝、赋值和销毁对象时发生的行为。拷贝构造函数的用途:当创建了一个新对象时,可以用另一个对象的数据初始化这个新建的对象。

1、默认拷贝构造函数

  如果在程序中我们没有显示定义拷贝构造函数,则C++会为每个类隐式地提供一个缺省的拷贝构造函数,不过就算我们显示定义了拷贝构造函数,程序同样也会自己合成一个默认的构造函数。缺省的构造函数简单地将参数对象的每个数据域复制给对象中相应的副本。拷贝构造函数和赋值运算符是相似的,它们把一个对象的值赋给另一个对象,但两者不一样!使用拷贝构造函数将创建新的对象,而使用赋值运算符则不会创建新对象比如下面的例子:

//circle.h
#ifndef _CIRCLE_H_
#define _CIRCLE_H_

class Circle{
    public:
        Circle();
        Circle(double radius);
        ~Circle();
        void setRadius(double radius);
        double getRadius();
        double getArea();
    private:
        double radius;
};

#endif //circle.h
#include "circle.h"
#include <iostream>

Circle::Circle(){
    radius = 1;
}

Circle::Circle(double radius){
    this->radius = radius;
}

void Circle::setRadius(double radius){
    this->radius = radius;
}

double Circle::getRadius(){
    return radius;
}

double Circle::getArea(){
    return 3.14159 * radius * radius;
}

Circle::~Circle(){
}

测试函数main:

#include <iostream>
#include "circle.h"
using namespace std;

int main(){
    Circle c1(99);
    Circle c2(c1);    //这里没有显示定义拷贝构造函数,编译器就隐式调用了一个 
    
    cout << "The c1 radius is " << c1.getRadius()
        << " and area is " << c1.getArea() << endl;
    
    cout << "The c2 radius is " << c2.getRadius()
        << " and area is " << c2.getArea() << endl;
        
    return 0;
}

运行结果如下(我们发现两个Circle对象c1和c2数据域都是一样的):

技术分享

 

2、“深拷贝”和“浅拷贝”

  “浅拷贝”指的是拷贝指针的地址,不拷贝该指针指向的内存内容;“深拷贝”指的是拷贝指针指向的内存内容,不拷贝指针本身。程序隐式生成的拷贝构造函数和赋值运算符进行对象复制采用的是一种所谓的“浅拷贝”。

 

继续更新。。。

 

C++拷贝构造函数专题

标签:3.1   结果   def   测试   span   编译   fine   void   技术   

原文地址:http://www.cnblogs.com/mocuishle/p/7617995.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!