在C++中所有數據組合的類型都是自定義的數據結構。 包括我們常常使用的string、istream、ostream等。 一個簡單的類型定義,以struct開頭進行書寫。 類內初始值的作用:創建對象時,類內初始值將用於初始化數據成員。 如何使用我們自定義的類型 運行結果: 以上我們的程式就已經基本完成 ...
在C++中所有數據組合的類型都是自定義的數據結構。
包括我們常常使用的string、istream、ostream等。
一個簡單的類型定義,以struct開頭進行書寫。
//Sales_data.h
#include <string>
struct Sales_data { std::string bookNo; unsigned units_sold = 0; // C++ 11標準規定,可以對數據成員提供類內初始值 double revenue = 0.0; };
類內初始值的作用:創建對象時,類內初始值將用於初始化數據成員。
如何使用我們自定義的類型
// main.cpp #include <iostream> #include <string> #include "Sales_data.h" int main() { Sales_data data1, data2; // 讀入data1和data2的代碼 double price = 0; // 輸的單價,用於計算銷售收入 // 讀入第一筆交易:ISBN、銷售數量、單價 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; } // 如果相同,求data1和data2的總和 }
運行結果:
以上我們的程式就已經基本完成了。
我們也完成了一個多文件的編譯過程。
那麼我們為什麼要使用一個頭文件來定義Sales_data這個類型?
因為如果在一個項目中,類型需要在多出使用的話,那麼它們的定義就需要保持一致,而保持一致的最好辦法就是使用同一份聲明。
不知道大家是否有註意到,string這個文件在兩個代碼文件中都包含了。
那麼對於一個文件被多次包含,文件中的聲明也會有多份,我們需要一定的處理來使多次包含也能夠安全、正常的工作。
被處理後的頭文件如下:
#ifndef SALES_DATA_H // 防止被重覆包含的預處理語句 #define SALES_DATA_H #include <string> struct Sales_data { std::string bookNo; unsigned units_sold = 0; double revenue = 0.0; }; #endif //SALES_DATA_H
預處理變數的作用
#define 將一個名字設定為預處理變數
#ifdef 僅當變數已定義時為真
#ifndef 僅當變數未定義時為真
#endif 從ifdef或ifndef開始到此行結束