C++学习笔记2:构造函数与析构函数

构造函数

一、普通构造函数

构造函数是一种特殊的成员函数,它主要用于为对象分配空间,进行初始化。构造函数的名字必须与类名相同,而不能由用户任意命名。它可以有任意类型的参数,但不能具有返回值。它不需要用户来调用,而是在建立对象时自动执行。

class score {
public:
    score(int m, int f);    /* 构造函数 */
    void setScore(int m, int f);
    //inline void showScore();

private:
    int mid_exam;
    int fin_exam;
};

/* 构造函数 */
score::score(int m, int f) {
    mid_exam = m;
    fin_exam = f;
}

/* 普通成员函数的定义 */
void score::setScore(int m, int f) {
    mid_exam = m;
    fin_exam = f;
}

在建立对象的同时,采用构造函数给数据成员赋值,通常由以下两种形式 

1.类名 对象名[(实参表)]
score opt2(10, 20);
opt2.showScore();

2.类名 *指针变量名 = new 类名[(实参表)]
opt1 = new score(66, 66);
opt1->setScore(54, 199);
opt1->showScore();

特点:
        1,构造函数没有返回值,也不需要写 void
        2,构造函数的名字一定要和类名相同

             与普通的成员函数一样,构造函数的函数体可以写在类体内,也可写在类体外。

        3,构造函数和普通函数一样,可以没有参数,也可以有参数(一个或多个)构造函数

              可以进行重载
        4,构造函数无需程序员手动调用,由编译器自动调用
             什么时候调用?创建对象的时候自动调用

注意:

  创建对象的时候,会根据你的创建语法去匹配对应的构造函数:
            类名 对象名; -> 调用无参构造函数
            类名 对象名(参数); ->调用有参构造函数
            类名 对象名(); //error,编译器会认为这是声明了一个函数

 c++11标准(新标准)统一了两种写法:
            类名 对象名{}; -> 调用无参构造函数
            类名 对象名{参数}; ->调用有参构造函数

 当你创建/构造对象的时候,如果没有与参数列表相匹配的构造函数,就会报错 ->构造失败

二、成员初始化列表

类名::构造函数名([参数表])[:(成员初始化列表)]
{
    //构造函数体
}

  构造函数初始化列表是对构造函数的一种增强,它能够初始化一些特殊的成员
  如:
            对象成员    -》指定调用该对象的某个构造函数
            常量成员    -》被 const修饰的成员变量
            引用成员   
            基类成员 

class A{
private:
	int x;
	int& rx;
	const double pi;
public:
	A(int v) : x(v), rx(x), pi(3.14)    //成员初始化列表
	{	}
	void print()
	{
		cout << "x = " << x << " rx = " << rx << " pi = " << pi << endl;
	}
};

思考1:B类中有一个A类对象成员,在创建B类对象时,会先调用A类的构造函数,如果A类有多个构造函数,会默认调用哪个???
            ->  默认调用无参构造函数

思考2:如果A类没有无参构造函数/就是想调用A类的有参构造函数,程序员自己指定调用A类的某个构造函数

           ->构造函数初始化列表

/* 圆心类 */
class circelPos {
public:
    circelPos(int x, int y);
    void setPos(int x, int y);
    int getX() const;
    int getY() const;
private:
    int x;
    int y;
};


/* 圆类 */
class Circel {
public:
    Circel(int x1, int y1, int r1, int color1);
    int getR() const;
    const circelPos *getPos() const;
    int getColor() const;
    void check() const;
private:
    int r;
    int color;
    circelPos pos;
};


circelPos::circelPos(int x, int y) {
   this->x = x;
   this->y = y;
}

/* 如果圆心类有多个构造函数,可以指定圆类调用哪个构造函数 */
Circel::Circel(int x, int y, int r1, int color1) : pos{x, y}, r(r1), color(color1) {
    cout << "构造函数使用中" << endl;
}

析构函数

析构函数也是一种特殊的成员函数。它执行与构造函数相反的操作,通常用于撤销对象时的一些清理任务,如释放分配给对象的内存空间等。

析构函数语法:

~函数名() {
    .....
}


    特点:
        1,析构函数没有返回值,也不需要写void
        2,函数名 : ~类名
        3,不能有参数
        4,不需要程序员手动调用,由编译器自动调用
            什么时候自动调用? 对象被销毁的时候(生存期到了)

        如果没有自己实现,也会默认生成一个

score::score(int data1) : PI{3.14} {
    cout << "score()无参构造函数" << endl;
    data = data1;
}

/*
score::score(int data1) {
    cout << "score()有参构造函数" << endl;
    data = data1;
}
*/

score::~score() {
   cout << "score()析构函数" << endl;
}

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值