簡體   English   中英

C++ 類構造函數和 istream 運算符>>

[英]C++ class constructor and istream operator>>

  1. 使用具有多個變量的構造函數時。 我首先初始化它,然后把它放到構造函數中。 使用這種方法,數據只能分別通過文件或控制台輸入。

  2. 但是當使用 istream 運算符時>>。 我使用了默認構造函數,然后將其放入 istream operator>> 方法。 但是我發現以這種方式似乎沒有必要使用除默認構造函數之外的其他構造函數,但是屬性可以通過文件或控制台輸入。 例如:

     class Fraction { private: int numerator; int denominator; public: Fraction(int num,int den); Fraction(); friend istream& operator>>(istream& is,Fraction &frac); }; void main() { int num,int den; cin>>num>>den; Fraction fra(num,den); } istream& operator>>(istream& is,Fraction &frac) { is>>frac.numerator>>frac.denominator; return is; } void main() { Fraction f; ifstream inputFile("data.txt"); if(inputFile.file()) { cout<<"File cannot be opened!"<<endl; } inputFile>>f; inputFile.close(); //with input from console cin>>f; }

我的問題是應該推薦使用第一種方法還是第二種方法?

編寫安全且方便您使用的代碼。

Fraction類很簡單,並且具有廣泛的潛在用途,因此它同時具有構造函數和序列化運算符是合理的。 作為一般規則,簡單和通用的類是最好的。

對於包含許多屬性或具有復雜驗證規則的結構化數據的類,擁有一個帶有許多參數的構造函數(或許多構造函數重載,並且替代參數的選擇令人困惑)可能會很不方便,因此您可以跳過它並不使用它。 但這將是程序設計的一個危險信號,是“神級”問題的征兆。

通常數值是默認構造的,然后從輸入中讀取,因為它們的默認構造和分配非常便宜。 在這種情況下,您是否願意這樣做只是風格問題。

盡管如此,您的代碼中有一個主要錯誤:

istream& operator>>(istream& is,Fraction &frac);

像 a@ 這樣的運算符的成員重載是這樣的:

istream& operator>>(istream& is);

資料來源: en.cppreference.com

重載operator>>的常用方法是這樣寫:

friend istream& operator>>(istream& is, Fraction& frac);

為什么不是會員? 因為如果它是會員,你會這樣寫:

object >> stream;

這是非常煩人和無用的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM