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

本文详细介绍了构造函数和析构函数的概念及其在C++中的应用。构造函数用于初始化类成员,确保对象状态的有效性;析构函数则在对象生命周期结束时释放资源。文章通过具体示例展示了如何定义和使用这两种特殊成员函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

构造函数
  构造新对象、将值赋给它的数据成员
析构函数
  用构造函数创建对象后,程序负责跟踪对象,直到其过期为止。对象过期时,程序将自动调用一个特殊的成员函数
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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值