1:知識點1:類的定義方法:struct和class兩種方法的用法和區別。
知識點2:類內成員的初始化方法:成員初始化列表。編譯器會調用構造函數初始化成員,可以被重載。
首先舉個例子方便于理解:
#include <iostream>#include<string>#include<vector>using namespace std;/*C++ 中保留了C語言的 struct 關鍵字,并且加以擴充。在C語言中,struct 只能包含成員變量,不能包含成員函數。而在C++中,struct 類似于 class,既可以包含成員變量,又可以包含成員函數。C++中的 struct 和 class 基本是通用的,唯有幾個細節不同:1:使用 class 時,類中的成員默認都是 PRivate 屬性的;而使用 struct 時,結構體中的成員默認都是 public 屬性的。(最本質的區別)2:class 繼承默認是 private 繼承,而 struct 繼承默認是 public 繼承(《C++繼承與派生》一章會講解繼承)。3:class 可以使用模板,而 struct 不能。*///利用class定義類class Student{ Student(string name, int age, int score);//構造函數 string m_name; int m_age; int m_score;//定義三個變量 void showname()//定義一個函數 { cout<<m_name<<"的年齡是:"<<m_age<<",得分為:"<<m_score<<endl; }//類內定義的函數,編譯器會優先視為內聯函數public:private:protected://三種形式};Student::Student(string name, int age, int score):m_name(name), m_age(age), m_score(score){ }//成員初始化列表,將name賦給m_name,改變類內變量//利用strcut定義類struct Students{ Students(string name, int age, int score);//構造函數 string m_name; int m_age; int m_score;//定義三個變量,默認public void shownames()//定義一個函數 { cout<<m_name<<"的年齡是:"<<m_age<<",得分為:"<<m_score<<endl; }//類內類外定義皆是在同文件中,也可定義在.h文件中。};Students::Students(string name, int age, int score):m_name(name), m_age(age), m_score(score){ }//列表初始化,覆蓋類的內部變量/*總結1:struct作為數據結構的實現體,它默認的數據訪問控制是public的,而class作為對象的實現體,它默認的成員變量訪問控制是private的2:當你覺得你要做的更像是一種數據結構的話,那么用struct,如果你要做的更像是一種對象的話,那么用class。 3:然而對于訪問控制,應該在程序里明確的指出,而不是依靠默認,這是一個良好的習慣,也讓你的代碼更具可讀性。 */int main(int argc, char** argv){ Student stu1("小明", 18, 3);//報錯:雖然已聲明,但是不可訪問。成員沒有限定public,默認都是private,外部不可訪問。 Students stu2("小明", 18, 3);//正常 stu2.shownames(); return 0;}此題的答案:
#include <iostream>#include<string>#include<vector>using namespace std;struct Sales_data { Sales_data(); string bookNo; unsigned units_sold ; double revenue ;//類內部的變量成員不允許在定義時初始化,必須使用構造函數};Sales_data::Sales_data(){ units_sold = 0; revenue = 0.0;}int main(int argc, char **argv){ Sales_data total;//此部分和第一章21頁的內容相同 if (cin >> total.bookNo >> total.units_sold >> total.revenue) { Sales_data trans; while (cin >> trans.bookNo >> trans.units_sold >> trans.revenue) { if (total.bookNo == trans.bookNo) { total.units_sold += trans.units_sold; total.revenue += trans.revenue;//第三題的使用修改之處 } else { cout << total.bookNo << " " << total.units_sold << " " << total.revenue << endl; total = trans; } } cout << total.bookNo << " " << total.units_sold << " " << total.revenue << endl; } else { std::cerr << "No data?!" << std::endl; return -1; } return 0;}2:知識點1:在.h文件中聲明類較好知識點2:this指的是“這個”對象,是一個常量指針
知識點3:緊跟在參數列表之后的const表示this是一個常量指針——關于const成員函數,表明常量成員函數不能改變調用它對象的內存,也就是表示該函數只可訪問,不可修改。
本小節已經介紹了combine和isbn的相關信息,直接加入該類即可。
3:將第一題中的+=操作改為使用combine函數即可。
4 . 5:使用class來實現這個類
#include <iostream>#include<string>#include<vector>using namespace std;class Person{public://聲明為public Person(string Client_name, string Client_address);//構造函數 Person();//構造函數的重載 string name; string address;//內部變量 void Show_info() { cout<<name<<"'s"<<" address is "<<address<<endl; }//類內定義函數 string& const getname() { return name; } string& const getaddress() { return address; }//返回姓名地址的函數,只可訪問,不可修改};Person::Person(string Client_name, string Client_address):name(Client_name),address(Client_address){};//構造函數定義內部變量//此處我們在一個文件內定義了該類,如若類較大,應置于.h文件中int main(int argc, char **argv){ Person Client1("Mr.right","your heart");//實例化 Client1.Show_info();//調用其中的顯示信息函數 return 0;}最好是const,這樣就可以保證該函數只能訪問內部變量而不能寫內部變量。
6 . 7:知識點1:與類相關的函數雖然可以定義聲明分開,但是需要將其與類放在同一個文件中,這樣在使用接口時只需要引入一個文件即可。
加入書中的三個函數即可
替換掉原來的三種操作皆可
8:知識點:普通引用和常量引用的區別在于你是否想改變它~
9:知識點:撰寫頭文件時,無論是否被包含在其他任何頭文件中,都應設置保護符,防止重復包含
撰寫頭文件時應加上以下代碼:
#ifndef Cccc//第一次包含本頭文件時,#ifndef判斷為真,預處理器將處理后面的內容直到#endif,此時的預處理變量Cccc已定義#define Cccc//第二次包含本頭文件時,#ifndef判斷為假,預處理器將忽略后面的內容,預處理變量一般定義為本頭文件的大寫形式/*....*/#endif//只要簡單的加上就好了,無視C++中的作用域規則稍加修改即可:
istream& read(istream& is, Person& person){ is >> person.name >> person.address; if (!is) person = Person(); return is;//返回輸入流}//接受一個IO類型的引用作為其參數,IO類屬于不能被拷貝的類型,只能用引用來傳遞它們ostream& print(ostream& os, const Person& person){ os << person.name << " " << person.address; return os;}10:很明顯由外向內的分析,條件語句的作用是同時判斷兩次讀操作的對象。
新聞熱點
疑難解答
圖片精選