【C++ primer學習】2.6自定義數據結構

這章用關鍵字struct構建Sale_data類。並不是一個完整的類,知識嘗試把數據元素組織到一起。

Scale_data定義爲:

struct Sale_data{
    std::string bookNo;
    unsigned units_sold=0;//售出量
    double revenue=0.0;//銷售收入
};

注意:C++新標準規定,可以爲數據成員提供給一個類內初始值

沒有初始值的成員將被默認初始化。定義於任何函數體之外的變量被初始化爲0。定義在函數體內部的內置變量將不被初始化。一個未被初始化的內置類型變量的值是未定義的,這時候如果進行拷貝操作或者以其他形式訪問將會引發錯誤

編寫自己的頭文件

類通常被定義在頭文件中,而且類所在頭文件的名字應與類的名字一致。

頭文件通常包含哪些只能只能被頂一次的實體,如類、const、constexpr變量。

接下來我們要實現Sale_data類的定義(Sale_data.h文件中),並在主函數中將ISBN編號相同的書籍的收入和進行相加(main.cpp文件中)。因爲涉及到字符串操作,在以上兩個文件中都會包含string.h頭文件。使用Sale_data類的程序先後包含了兩次string.h頭文件。一次是直接包含(main.c中),一次是隨着包含Sale_data.h被隱式地包含進來的。在書寫頭文件時需要做適當處理,爲了確保頭文件多次包含仍能安全工作要使用預處理器技術。

預處理器概述

預處理器是在編譯之前執行的一段程序,可以部分改變我們編寫的程序。

(1)#include

(2)頭文件保護符,頭文件保護符依賴於預處理變量。預處理變量有兩個狀態:已定義和未定義。

#define指令把一個名字設定爲預處理變量#

#ifdef 當且僅當變量已定義時爲真

#ifndef當且僅當變量未定義時爲真。一旦檢查結果爲真,則執行後續操作,直到遇見#endif指令爲止。

 

以下是sale_data.h的代碼

#ifndef SALE_DATA_H
#define SALE_DATA_H
#include <string>

struct Sale_data{
    std::string bookNo;
    unsigned units_sold=0;//售出量
    double revenue=0.0;//銷售收入
};

#endif // SALE_DATA_H

如果SALE_DATA_H預處理變量未被定義,則定義SALE_DATA_H預處理變量並導入string頭文件,定義sale_data類。直到遇見#endif結束。

以下是mian.cpp代碼:

#include<iostream>
#include<string>
#include "Sale_data.h"

int main()
{
    Sale_data data1,data2;
    double price=0;//書的單價,用於計算銷售收入
    //讀入data1和data2
    std::cin>>data1.bookNo>>data1.units_sold>>price;
    data1.revenue=data1.units_sold*price;
    std::cin>>data2.bookNo>>data2.units_sold>>price;
    data2.revenue=data2.units_sold*price;

    //檢查data1和data2的ISBN是否相同
    if(data1.bookNo==data2.bookNo){
        unsigned totalCnt=data1.units_sold+data2.units_sold;//總冊數
        double totalRevenue=data1.revenue+data2.revenue;//總收入

        //輸出:ISBN、總銷售量、平均價格
        std::cout<<data1.bookNo<<" "<<totalCnt<<" "<<totalRevenue<<" ";
        if (totalCnt!=0)
            std::cout<<totalRevenue/totalCnt<<std::endl;
        else
            std::cout<<"(no sales)"<<std::endl;
        return 0;//標誌成功
        }else{  //兩筆交易的ISBN值不一樣
            std::cerr<<"Data must refer to the same ISBN"<<std::endl;
            return -1;//標誌失敗
        }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章