C++ Primer Plus学习:第十章 对象和类(2)

来源:互联网 发布:mac玫红色口红哪个最火 编辑:程序博客网 时间:2024/06/16 17:00
构造函数
  构造新对象、将值赋给它的数据成员
析构函数
  用构造函数创建对象后,程序负责跟踪对象,直到其过期为止。对象过期时,程序将自动调用一个特殊的成员函数
eg

  stock1.h

#ifndef STOCK1_H_#define STOCK1_H_class Stock{      private:              char company[30];              int shares;              double share_val;              double total_val;              void set_tot(){total_val = shares * share_val;}            public:             Stock();             Stock(const char *co,int n = 0,double pr = 0.0);             ~Stock();             void buy(int num,double price);             void sell(int num,double price);             void update(double price);             void show();      };      #endif


  stock1.cpp

#include <iostream>#include "stock1.h"Stock::Stock(){              std::cout<<"Default constructor called\n";              std::strcpy(company,"no name");              shares = 0;              share_val = 0.0;              total_val = 0.0;              }              Stock::Stock(const char *co,int n,double pr){                   std::cout<<"Constructor using "<<co<<" called\n";                   std::strncpy(company,co,29);                   company[29] = '\0';                                      if(n<0)                   {                          std::cerr<<"Number of shares can't be negative;"<<company<<" shares set to 0.\n";                          shares = 0;                          }                   else                       shares = n;                   share_val = pr;                   set_tot();                   }Stock::~Stock(){               std::cout<<"Bye,"<<company<<"!\n";               }               void Stock::buy(int num,double price){     if(num<0)     {              std::cerr<<"Number of shares purchased can't be negative."<<"Transaction is aborted.\n";              }     else     {         shares +=num;         share_val = price;         set_tot();         }     }void Stock::sell(int num,double price){     using std::cerr;     if(num<0)     {              cerr<<"Number of  shares sold can't be negative."<<"Transaction is aborted.\n";              }     else if(num>shares)     {          cerr<<"You can't sell more than you have! "<<"Transaction is aborted.\n";          }     else     {         shares -=num;         share_val = price;         set_tot();         }     }void Stock::update(double price){     share_val = price;     set_tot();     }void Stock::show(){     using std::cout;     using std::endl;     cout<<"Company: "<<company<<" Shares: "<<shares<<endl;     cout<<"Share Price:$ "<<share_val<<" Total Worth:$ "<<total_val<<endl;     }


  usestpck1.cpp

#include <iostream>//调用stock1.h头文件 #include "stock1.h"int main(){    using std::cout;    using std::ios_base;    cout.precision(2);    cout.setf(ios_base::fixed,ios_base::floatfield);    cout.setf(ios_base::showpoint);        cout<<"Using constructors to create new objects\n";    Stock stock1("NanoSmart",12,20.0);    stock1.show();    Stock stock2 = Stock("boffo Objects",2,2.0);    stock2.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);    cout<<"Revised stock1:\n";    stock1.show();    cout<<"Done\n";        system("pause");    return 0;    }


小结
  构造函数
    在创建类对象时被调用,与类名相同。
    用于初始化类成员
    匹配参数的个数
    若构造函数使用new,则必须通过使用delete的析构函数
Note
  在默认情况下,将一个对象赋给另一个同类对象时,C++将源对象的所有数据成员内容复制到目标对象数据成员中
  如果既可以通过初始化,又可以通过赋值来设置对象的值时,应该进量采用初始化的方式。效率更高
    初始化:Stock stock1 = Stock();
    赋值: Stock stock1; stock=Stock();