C++学习8 构造函数的参数初始化表

构造函数是一种特殊的成员函数,在创建对象时自动执行,主要用来进行初始化工作,例如对 private 属性的成员变量赋值。

对成员变量的初始化,除了在构造函数的函数体中一一赋值,还可以采用参数初始化表。请看下面的代码:

class Student{
private:
    char *name;
    int age;
    float score;
public:
    Student(char *, int, float);
    void say();
};
//在构造函数中采用参数初始化表
Student::Student(char *name1, int age1, float score1):name(name1), age(age1), score(score1){}
void Student::say(){
    cout<<name<<"的年龄是 "<<age<<",成绩是 "<<score<<endl;
}

如本例所示,在定义带参构造函数 Student(char *name1, int age1, float score1) 时,不再是在函数体中对成员变量一一赋值,其函数体为空。在函数首部与函数体之间增添了一个冒并加上 name(name1), age(age1), score(score1) 语句,这个语句的意思相当于函数体内部的 name = name1; age = age1; score = score1; 语句。

参数初始化表还有一个很重要的作用,那就是为 const 成员变量初始化。例如:

class Array{
public:
    Array(){
        length = 0; //compile error
        num = NULL;
    };
private:
    const int length;
    int * num;
};

在本例中Array类声明了两个成员变量,length 和 num 指针,需要注意的是 length 加了 const 关键字修饰。此时默认构造函数再为 length 赋值为 0,这是无法通过编译的

初始化 const 成员变量的唯一方法只有利用参数初始化表。例如:

class Array{
public:
    Array(): length(0){
        num = NULL;
    };
private:
    const int length;
    int * num;
};

需要注意的是:参数初始化顺序与初始化表列出的变量的顺序无关,参数初始化顺序只与成员变量在类中声明的顺序有关。

C++析构函数

创建对象时系统会自动调用构造函数进行初始化工作,同样,销毁对象时系统也会自动调用一个函数来进行清理工作(例如回收创建对象时消耗的各种资源),这个函数被称为析构函数。

析构函数(Destructor)也是一种特殊的成员函数,没有返回值,不需要用户调用,而是在销毁对象时自动执行。与构造函数不同的是,析构函数的名字是在类名前面加一个”~“符号。

注意:析构函数没有参数不能被重载因此一个类只能有一个析构函数。如果用户没有定义,那么编译器会自动生成。

析构函数举例:

#include <iostream>
using namespace std;
class Student{
private:
    char *name;
    int age;
    float score;
public:
    //构造函数
    Student(char *, int, float);
    //析构函数
    ~Student();
    //普通成员函数
    void say();
};
Student::Student(char *name1, int age1, float score1):name(name1), age(age1), score(score1){}
Student::~Student(){
    cout<<name<<"再见"<<endl;
}
void Student::say(){
    cout<<name<<"的年龄是 "<<age<<",成绩是 "<<score<<endl;
}
int main(){
    Student stu1("小明", 15, 90.5f);
    stu1.say();

    Student stu2("李磊", 16, 95);
    stu2.say();

    Student stu3("王爽", 16, 80.5f);
    stu3.say();
    cout<<"main 函数即将运行结束"<<endl;

    return 0;
}

可以看出,析构函数在 main 函数运行结束前被执行,并且调用顺序和构造函数正好相反,为了方便记忆,我们可以将之理解为一个栈,先入后出

析构函数在对象被销毁前执行;要知道析构函数什么时候被调用,就要先知道对象什么时候被销毁。

对象可以认为是通过类这种数据类型定义的变量,它的很多特性和普通变量是一样的,例如作用域、生命周期等。由此可以推断,对象这种变量的销毁时机和普通变量是一样的。

总结起来,有下面几种情况:
1) 如果在一个函数中定义了一个对象(auto 局部变量),当这个函数运行结束时,对象就会被销毁,在对象被销毁前自动执行析构函数。

2) static 局部对象在函数调用结束时并不销毁,因此也不调用析构函数,只有在程序结束时(如 main 函数结束或调用 exit 函数)才调用 static 局部对象的析构函数。

3) 如果定义了一个全局对象,也只有在程序结束时才会调用该全局对象的析构函数。

4) 如果用 new 运算符动态地建立了一个对象,当用 delete 运算符释放该对象时,先调用该对象的析构函数

注意:析构函数的作用并不是删除对象,而是在撤销对象占用的内存之前完成一些清理工作,使这部分内存可以分配给新对象使用。

时间: 2024-08-16 01:00:49

C++学习8 构造函数的参数初始化表的相关文章

使用参数初始化表来实现对数据成员的初始化

这是c++提供的一种机制,具体格式如下: 1 class BOX 2 { 3 public: 4 BOX(int h,int w ,int len); 5 private: 6 int height; 7 int width; 8 int length; 9 }; 10 11 使用参数初始化表初始化的方式: 12 13 BOX::BOX(int h ,int w ,int len):height(h), width(w), length(len){} 14 15 传统的方式是这样子写的: 16

第四周(参数初始化表)

/* *copyright(c) 2015,烟台大学计算机学院 *All rights reserved. *文件名称:第四周(三角形) *作者:王忠 *完成日期:2015.4.1 *版本号:v1.0 * *问题描述:输入三角形三条边长,求出面积 周长 *输入描述:输入三角形三条边长 *程序输出:输出面积 周长 #include <iostream> #include <cmath> using namespace std; class Triangle { public: Tri

c++基础语法之构造函数和初始化表

笔者刚系统的重学了c++的语法,看到构造函数和初始化表这块,发现这块语法有点复杂且很杂,怕以后忘记,于是写下此篇,以后回忆之用. c++构造函数 3.构造函数(constructor) Class/struct  类名 { //构造函数 类名(形参表) {函数体} }: 1)构造函数名字和类名相同,没有返回类型 2)构造函数在对象被创建时自动被调用 3)构造函数主要负责对象的初始化,即初始化成员变量 4)构造函数在每个对象的生命周期,一定会被自动调用,但只会被调用一次 Class  A { A(

学习C++ -&gt; 构造函数与析构函数

学习C++ -> 构造函数与析构函数 一.构造函数的介绍    1. 构造函数的作用        构造函数主要用来在创建对象时完成对对象属性的一些初始化等操作, 当创建对象时, 对象会自动调用它的构造函数.一般来说, 构造函数有以下三个方面的作用:            ■ 给创建的对象建立一个标识符;            ■ 为对象数据成员开辟内存空间;            ■ 完成对象数据成员的初始化.            2. 默认构造函数        当用户没有显式的去定义构造

【C/C++】构造函数、默认构造函数、成员初始化列表

常见问题 Q1. 下列关于构造函数的描述中,错误的是( ) A. 构造函数可以设置默认的参数 B. 构造函数在定义类对象时自动执行 C. 构造函数可以是内联函数 D. 构造函数不可以重载 Q2. 下列代码中a.b的各个成员变量值是多少? 1 class Student 2 { 3 public: 4 Student() {} 5 void show(); 6 private: 7 string name; 8 int number; 9 int score; 10 }; 11 Student a

c++构造函数问题,初始化和赋值问题

默认构造函数(就是没有参数的构造函数) The Default ConstructorThe default constructor is the constructor used to create an object when you don't provide explicit initialization values. That is, it's the constructor used for declarations like this: Stock stock1;  // use

什么时候需要在类的构造函数中使用初始化列表

1,如果基类没有default构造函数,则意味着其不能自己初始化.如果其被派生,派生类的构造函数要负责调用基类的构造函数,并传递给它需要的参数.下例中Base 2,如果类成员没有默认构造函数.下例中Elem4 2,如果类的成员变量中含有const成员变量,如果不使用列表,在构造函数中是不能对其赋值的,会导致编译失败.下例中b 3,如果类的成员变量中含有引用,引用必须被初始化.下例中c 4,需要提高效率的时候,如果不使用初始化列表,而放在构造函数体内赋值的方法,则变量先被默认构造函数初始化,然后又

C++学习7 构造函数

当创建一个对象时,往往需要做一些初始化工作,例如对数据成员赋值等.为了解决这个问题,C++提供了构造函数. 构造函数(Constructor)是一种特殊的成员函数,它的名字和类名相同,没有返回值,不需要用户调用(用户也不能调用),而是在创建对象时自动执行.构造函数的作用是在创建对象时进行初始化工作,最常见的就是对成员变量赋值. 一个构造函数的例子: #include <iostream> using namespace std; class Student{ private: char *na

Linux 程序设计学习笔记----命令行参数处理

转载请注明出处.http://blog.csdn.net/suool/article/details/38089001 问题引入----命令行参数及解析 在使用linux时,与windows最大的不同应该就是经常使用命令行来解决大多数问题.比如下面这样的: 而显然我们知道C语言程序的入口是mian函数,即是从main函数开始执行,而main函数的原型是: int main( int argc, char *argv[] ); int main( int argc, char **argv );