C++学习笔记十五之类的构造函数和析构函数

来源:互联网 发布:全球tv直播软件 编辑:程序博客网 时间:2024/06/05 22:59

构造函数

  • 构造函数是一种特殊的类成员函数,在类创建时被调用。构造函数的名称和类名相同,但通过函数重载,可以创建多个同名的构造函数,条件是每个函数的特征标(参数列表)都不同。另外,构造函数没有声明类型,没有返回值,也没有被声明为void类型。通常,构造函数用于初始化类对象的成员,初始化应与构造函数的参数列表相匹配

构造函数分为默认构造函数(不带参数)和带参数的构造函数。

默认构造函数是在未提供显式初始值时,用来创建对象的构造函数,可以在默认构造函数里初始化数据成员。
Class::Class()
{
a=0;
b="love";
}
有了默认构造函数就可以这样来创建对象:
Class abc;
因为没有参数所以不需要给对象赋初值。

非默认构造函数就是带有参数的构造函数,在创建对象时需要赋初值,也就是给参数赋值。
假设有一个构造函数:
Class::Class(int a,string &b)
{
............
}
在创建对象时就应该给对象赋初值
Class abc=Class(10,"abc");显式调用构造函数
或者
Class abc(10,"abc");隐式调用构造函数
或者
Class *abc=new Class(10,"abc");将构造函数和new一起使用
#注意:对象无法调用构造函数,因为构造函数是用来创建对象的,在构造函数构造出对象之前,对象是不存在的。

析构函数

  • 用构造函数创建对象之后,程序负责跟踪该对象,直到过期为止。对象过期时,程序将自动调用一个特殊的成员函数---析构函数,用来完成清理工作,就像new和delete一样,一个负责分配内存,一个负责清理内存。和构造函数一样,析构函数没有返回值和声明类型,但是析构函数是没有参数的,一般析构函数不承担任何重要的工作,所以函数内部不需要编写任何操作的函数,声明析构函数时需要在类名前面加上~。
Class::~Class()
{

}

【代码示例】
#include <iostream>#include <string>#include <stdlib.h>//c语言版本#include <cstdlib>class Stock{private:std::string company;long shares;double share_val;double total_val;void set_tot() { total_val = shares * share_val; }public:Stock();        // default constructorStock(const std::string & co, long n = 0, double pr = 0.0);~Stock();       // noisy destructorvoid show();};// constructors (verbose versions)Stock::Stock()        // default constructor{std::cout << "Default constructor called\n";company = "no name";shares = 0;share_val = 0.0;total_val = 0.0;}Stock::Stock(const std::string & co, long n, double pr){std::cout << "Constructor using " << co << " called\n";company = co;if (n < 0){std::cout << "Number of shares can't be negative; "<< company << " shares set to 0.\n";shares = 0;}elseshares = n;share_val = pr;set_tot();}// class destructorStock::~Stock()        // verbose class destructor{std::cout << "Bye, " << company << "!\n";}// other methodsvoid Stock::show(){using std::cout;using std::ios_base;// set format to #.###ios_base::fmtflags orig =cout.setf(ios_base::fixed, ios_base::floatfield);std::streamsize prec = cout.precision(3);cout << "Company: " << company<< "  Shares: " << shares << '\n';cout << "  Share Price: $" << share_val;// set format to #.##cout.precision(2);cout << "  Total Worth: $" << total_val << '\n';// restore original formatcout.setf(orig, ios_base::floatfield);cout.precision(prec);}int main(){{using std::cout;cout << "Using constructors to create new objects\n";Stock stock1("NanoSmart", 12, 20.0);            // syntax 1,创建对象时,会自动调用相对应的构造函数stock1.show();Stock stock2 = Stock("Boffo Objects", 2, 2.0); // syntax 2stock2.show();cout << "Assigning stock1 to stock2:\n";stock2 = stock1;cout << "Listing stock1 and stock2:\n";stock1.show();stock2.show();cout << "Using a constructor to reset an object\n";stock1 = Stock("Nifty Foods", 10, 50.0);    // temp objectcout << "Revised stock1:\n";stock1.show();cout << "Done\n";}// std::cin.get();system("pause");return 0;}