类的构造和析构函数

C++提供了一个特殊的成员函数——类构造函数。专门用于构造新对象、将值赋给它们的数据成员。更准确的说,C++为这些成员函数提供了名称和使用语法,而程序员需要提供方法定义。

1 声明和定义构造函数

2 使用构造函数

3 默认构造函数

4 析构函数

用构造函数创建对象后,程序负责跟踪该对象,直到过期为止。对象过期时,程序将自动调用一个特殊的成员函数,该函数的名称令人生畏——析构函数。析构函数完成清理工作,因此实际上很有用。例如,如果构造函数使用new来分配内存,则析构函数将使用delete来释放这些内存。
和构造函数一样,析构函数的名称也很特殊:在类名前加上~。另外,和构造函数一样,析构函数也可以没有返回值和声明类型。与构造函数不同的是,析构函数没有参数。
什么时候应调用析构函数呢?这是由编译器决定的,通常不应再代码中显示地调用析构函数。如果创建的事静态存储类对象,则其析构函数将在程序结束时被调用。如果创建的事自动存储类对象,则其系统函数将在程序执行完代码块时自动被调用。如果对象是通过new创建的,则它将驻留在栈内存或自由存储区中,当使用delete来释放内存时,其析构函数将自动被调用。最后,程序可以创建临时对象来完成特定的操作,在这种情况下,程序将在结束对该对象的使用时自动调用其析构函数。
由于在类对象过期时析构函数将自动被调用,因此必须有一个析构函数。如果程序员没有提供析构函数,编译器将隐式地声明一个默认析构函数,并在发现导致对象呗删除的代码后,提供默认析构函数的定义。

注意:在默认情况下,将一个对象赋给同类型的另一个对象时,C++将源对象的每个数据成员的内容复制到目标对象中相应的数据成员中。

构造函数不仅仅可用于初始化新对象。例如,有如下语句:

stock1=Stock("Nifty Foods",10,50.0);
stock1对象已经存在,因此这条语句不是对stock1进行初始化,而是将新值赋给它。这是通过让构造程序创建一个新的、临时的对象,然后将其内容复制给stock1来实现的。随后程序调用析构函数,以删除该临时对象。

如下两个语句所有根本性的差别:
Stock stock2=Stock("Boffo Objects",2,2.0);
stock1=Stock("Nifty Foods",10,50.0);

第一条语句是初始化,它创建有指定值的对象,可能会创建临时对象(也可能不会);第二条语句是赋值。像这样在赋值语句中使用构造函数总会导致在赋值前创建一个临时对象。

提示:如果既可以通过初始化,也可以通过赋值来设置对象的值,则应采用初始化方式。通常这种方式的效率更高。

5 C++11列表初始化

在C++11中,可将列表初始化语法用于类,只有提供与某个构造函数的参数列表匹配的内容,并用大括号将它们括起:
Stock hot_tip={"Derivationg Plus Plus",100,45.0};
Stock jock{"Sport Age Storage,Inc"};
Stock temp {};

在前两个声明中,用大括号括起的列表与下面的构造函数匹配:
Stock::Stock(const std::string &co,ling n=0,double pr=0.0);

第一个和第二个将调用上面的构造函数,第三个将调用默认构造函数。

6 const成员函数

声明:
void show() const;
同样,函数定义的开头应像这样:
void stock::show() const
以这种方式声明和定义的类函数被称为const成员函数。就像应尽可能将const引用和指针用作函数形参一样,只有类方法不修改调用对象,就应将其声明为const。

缺省构造函数是C++及其他一些面向对象程序设计语言中,对象的不需要参数即可调用的构造函数。对象生成时如果没有显式地调用构造函数,则缺省构造函数会被自动调用。C++标准规定,如果构造函数没有参数(nullary),或者构造函数的所有参数都有缺省值(default value),都算作缺省构造函数。[1]一个类只能有一个缺省构造函数

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值