构造函数小结

概念

构造函数是一种特殊的类成员函数,在创建类对象时候调用。有以下特性:1)构造函数名称和类名称一样;2)不声明返回类型;3)可以重载,但是每个函数的参数列表要不同;
主要用途:初始化类对象的成员

析构函数:当对象被删除时调用的函数,每个类只有一个析构函数。构造函数没有返回类型,也没有参数,名称和类相同而且前面加上 ~ 。
//如果构造函数使用了new 那么必须提供实用delete的析构函数。
主要用途:释放内存,或者其他处理。

//
//  test.h
#ifndef test_h
#define test_h
#include<iostream>  // std::cout std::endl
//Circl:: 圆,圆心和半径
class Circl{
private :
    double x0,y0;
    double r;
public:
    Circl(){std::cout<<"begin."<<std::endl;};
    Circl(double x,double y,double z){x0=x;y0=y;r=z;};
    ~Circl(){std::cout<<"end."<<std::endl;};
};

#endif /* test_h */
// main
#include<iostream>
#include "test.h"  // test.h
using namespace std;
int main()
{
    Circl C0;  //对于未被初始化的对象,程序将用默认构造函数来创建
    Circl C1(1.0, 1.0, 1.0)  // primary form
    Circl C2={1.0, 1.0, 1.0};  // C++11
    cout<<"middle"<<endl;
    return 0;
}
// 不带任何参数的构造函数称为“默认构造函数”,也叫做“缺省构造函数”。
// 如果程序中没有构造函数,程序自动生成一个默认构造函数
// 默认构造函数没有参数,如果有参数则必须要给所有参数都提供默认值
Circl();
Circl(double x=1);

以下为补充内容:

1)使用 初始化列表 来初始化成员数据。
该列表在定义构造函数时候使用,以 : 开头,位置如下

class Circl{
private :
    double r;  // C++11
public:
    //初始化列表
    Circl(int x) : r(x) { };
}

2)在构造函数初始化列表里调用其他构造函数,称作“委派构造函数”。

class Circl{
private :
    double r {1};  // C++11
    void Inti(){.../*其他初始化*/};
public:
    // 委派构造函数
    Circl(){ Inti();};
    Circl(int x) : Circl() {r=x;};
}

3)拷贝构造函数
函数调用时,若以类的对象为形参或返回对象时,编译器会自动生成拷贝构造函数,在已有对象的基础上生成新对象。
拷贝构造函数的参数是语言规定的,是同类对象的常量引用。
作用:用参数对象的内容初始化当前对象

class Circl{
private :
    double r;
public:
    Circl(const Circl& src){r= src.r; /*...*/};
}

*隐含的复制构造函数:
1)如果程序员没有为类声明拷贝初始化构造函数,则编译器自己生成一个隐含的复制构造函数。
这个构造函数执行的功能是:用作为初始值的对象的每个数据成员的值,初始化将要建立的对象的对应数据成员。

2)如果不希望对象被复制构:
C++98做法:将复制构造函数声明为private,并且不提供函数的实现。
C++11做法:用“=delete”指示编译器不生成默认复制构造函数。

class Point {   //Point 类的定义
public:
    Point(int xx=0, int yy=0) { x = xx; y = yy; }    //构造函数,内联
    Point(const Point& p) =delete;  //指示编译器不生成默认复制构造函数
private:
    int x, y; //私有数据
};

什么时候复制构造函数被调用:
1)定义一个对象时,以本类另一个对象作为初始值,发生复制构造;

2)如果函数的形参是类的对象,调用函数时,将使用实参对象初始化形参对象,发生复制构造;

3) 如果函数的返回值是类的对象,函数执行完成返回主调函数时,将使用return语句中的对象初始化一个临时无名对象,传递给主调函数,此时发生复制构造。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值