C++需要注意的地方

1、當一個函數返回引用時,實際返回了一個變量的內存地址
2、setw(只對其緊跟的起作用)
3、setw setfill(‘+’)
4、setprecision()
5、setprecision() setiosflags(ios::fixed)//小數點右邊有幾位小數;
6、setiosflags(ios::showpos)//強制顯示符號;
7、setiosflags(ios::showbase)
8、setiosflags(ios::scientific)
9、setiosflags(ios::showpoint)
10、Point::setPoint(double,double)方法:設置Point對象的x座標(第一個參數)和y座標(第二個參數)並返回本對象,一定要注意返回類型爲Point &也就是類名 &,在函數體中,返回一個地址即* this
11、int getData()const 是指這是個常量函數只能被常量對象(即常量函數等)訪問。
12、常量成員函數中不能調用非常量成員函數;
13、派生類中的虛類要保持其虛特性,必須基類虛函數與函數原型完全相同(即要求每個形參的類型相同,函數返回類型也要相同),否則就是普通的函數重載,與基類的虛函數無關。
14、判斷地址是否相同的方法
bool operator==(const Array& p)
{ if(this==&p)
return true;
}
15、在用了動態分配的時候千萬別忘記刪除動態分配區域
~Array(){if(mems!=NULL)delete []mems;}
16、
int& operator[](int i)//只要沒有返回一個臨時變量,最好是都加上&符號;
{
return ar[i];
}
17、重載[]的時候返回類型必須是&類,因爲要cin,必須得返回引用,輸出無所謂,輸入必須引用,輸出最好也引用。
18、在friend ostream& operator<<(ostream& os,const Time& p)這裏,必須要寫const原因如下:
(1)const作爲形參時,既可以傳遞引用,又可以傳遞常量,但不加const只能傳遞引用。
(2)++t和-–t返回的均爲自身引用,但是-–t和++t返回的非引用,返回的是常量。
意思就是如果一個常量返回的是引用的話,可以不加const,但是如果返回的不是引用的話必須加const
cout輸出的是引用
19、+=是…=…+…的意思,所以在重載+=的運算符的時候要返回的形式也是…=…+…的形式,而不能直接返回…+…
20、const int getData()是指這個函數的返回值是個常量,只能使用他(這個返回值)不能改變它。
int getData()const 是指這是個常量函數只能被常量對象(即常量函數等)訪問。
21、到底何時調用拷貝構造函數呢?
{X p2=p1;}
Point p2(p1);//這裏會調用拷貝構造函數;
Line(Point &p):p1(p){}//這裏調用了拷貝構造函數,前面沒有調用拷貝構造函數,但是後面p1(p)這裏調用了拷貝構造函數;
Point p2(p1);//這裏會調用拷貝構造函數;
void f(X p){}//這裏是傳值參數,所以調用拷貝構造函數;
22、矩陣相乘的模板

void matrixMultiply(T **a, T **b, T **c, int n,int p)  
{  
    for (int i = 0; i < m; i++)  //a的行數
    {  
        for (int j = 0; j < p; j++)  //b的列數
        {  
            int sum=0;//在這裏指明sum=0;
            for (int k = 0; k < n; k++)  //a的列數  //b的行數
            {  
                sum += a[i][k] * b[k][j];  //注意這裏是乘號;
            }  
            m[i][j] = sum;  
        }  
    }  
}  

23、T * a;那麼a代表起始地址,如果l是a的長度的話,那麼a+l代表最終地址;
24、Vector T;那麼,T代表的是地址;
25、當一個函數有重載的時候,最好不要使用默認構造參數;
26、靜態成員
(1)靜態成員的命名和賦值;
static int sum;
類型 類名::靜態成員名=初始值;
(2)靜態成員訪問
靜態成員被被定義爲公有成員的時候,在類外有以下形式
通過類名訪問(用下面的方法訪問的時候,函數名前面必須要寫上static)
類名::靜態數據成員名;
類名::靜態成員函數名(參數列表);
這種使用方法是非靜態成員沒有的
上述方法是最常見並且最好使用上述方法,這樣可以和普通的函數區別開
27、如果要是想給一個對象一個編號的話,就要採用靜態成員賦給一個常量的方法
28、封閉類中賦值

class Computer
{
private:
    CPU p1;
    Memory p2;
    string name;
public:
Computer(CPU cpu,Memory me,string na):p1(cpu),p2(me),name(na){}//這裏會調用拷貝構造函數,而且,在Computer構造函數中,定義的是CPU,而不是int p1;(CPU中的成員函數)

29、在封閉類中賦值的時候,一定是給封閉類中的類名賦值,如Base p1(Base類中的對象爲int類型),那麼就給p1賦值,至於在封閉類中如何定義函數有兩種類型,一種是Derived(int a):p1(a);另外一種是Derived(Base p):p1(p),至於選哪一種方式,則具體看main函數中是什麼樣子的。
在多態和繼承中,則只能是Derived(int a):Base(a),而且,必須給封閉類中的類賦值;
30、File到new到project
少了東西從view中找
31、用了動態分配new的時候,千萬別忘記delete掉,有時候delete和輸出也有先後順序,要記住先順序;
32、一般Line(Point &p,Point &q):p1(p),p2(q){++sum;++no;}和後面這裏都需要加引用符號Line(Line&p):p1(p.p1),p2(p.p2){++sum;++no;}
33、計數Line類和計數Point類
在計數數字的時候,上下都可以是sum和now,因爲類內定義的變量只屬於這個類,雖然它是靜態變量,存在全局數據區,但還是隻歸它所屬的類。因此上面的sum和now只計數上面的類數目,下面的sum和now只計數下面的類數目,雖然名稱相同,但是計數的個數和類型是不同的;
34、看各種運算符重載的格式
35、對於引號的輸出方法如下cout<<”A student whose name is “<<”\“”<

Person(const Person& p):age(p.age)
    {
        name=new char[strlen(p.name)*2];//這裏前萬別忘記*2或者+1;
        strcpy(name,p.name);
        cout<<"A person whose name is "<<'"'<<name<<'"'<<" and age is "<<age<<" is cloned!"<<endl;
}

方法二:

for(int i=0;i<strlen(p.name);i++)
{
    name[i]=p.name[i];
}name[strlen(p.name)]=0;
或者name[strlen(p.name)]='\0';//千萬不要忘記寫‘\0’;注意斜槓的方向

37、注意delete數據的時候,要看清楚在哪裏delete,一般先輸出,然後再delete掉。
也就是~Person(){cout<<"A person whose name is \""<<name<<"\""<<" and age is "<<age<<" is erased!"<<endl;delete[]name;}
千萬不要先delete []name,這樣的話,輸出會出現錯誤;
38、如果對象是char* 或者int* 啥的話,就必須要帶length,但是,vector等容器中自帶length,不需要帶着length;
39、strlen最好不要放在循環裏,因爲它的執行時間很長,最好把它賦給一個數len,用len代替它
40、

class Expression
{private:
      int a,b;
      char c;public:
    Expression():a(0),b(0){}
    Expression(int aa,int bb,char cc):a(aa),b(bb),c(cc){}
};

char不需要賦初值;
41、Array::get(int n)方法:按格式從輸入讀取n元素。
封裝一個整型數組類,用於存儲整數和處理的相關功能
一個是不要忘記len,也就是長度,一個是不要忘記在get中給len賦值。
42、template
43、

Point* p=new Point(x,y);//注意這裏賦值的方法,再一次做的時候,還是卡在這裏;
        return *p;//返回的爲一個內容,=而不應該爲地址;
        //返回臨時對象的時候在Point getCentroid()不能加引用;即Point& getCentroid()是錯誤的;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章