疑問 實驗 錯誤 C++篇

1.       class Book{

private:
public:
void print(int m){
cout<<m<<endl;
}
};

class AudioBook: public Book{
public:
void print(){
cout<<"演說者:"<<endl;
}
};

int main(){
AudioBook ab1;
ab1.print(3);
return 0;

question:爲什麼編譯錯誤?'print' : function does not take 1 parameters
雖說當派生類與基類有同名成員時,派生類中的成員將屏蔽基類中的同名成員。所以派生類void print()將基類的void print(int m)屏蔽了。
但是根據子類對象中查找某個標識符的步驟:
1. 首先查找本類函數作用域; 2. 查找函數外圍作用域;    3. 再往外擴大到class Base作用域
4. 再往外擴大到Base所在的namespace作用域                              5.最後,查找全局作用域

所以應該還是能夠找到void print(int m)的啊?


answer: 有人會由疑問:子類全盤吸收了父類的成員,再新增加了與父類同名但形參表不同的數據成員,在子類作用域中它們難道不構成
重載關係嗎?如果C++編譯器是這麼理解,那麼,新增與父類同名的數據成員將如何處理?豈不是同名衝突?新增了與父類同名也同形參
表的成員函數又該如何?爲了應對這一局面,C++編譯器專門設置了隱藏機制:在繼承樹中,子類再度出現了與父類同名的成員(包括數
據和函數成員),無論是哪類成員,也不管形是否相同,一律按隱藏處理,即子類新增的標識符遮蓋了父類的同名的標識符。擴大到父
類作用域找的時候就不會再找相同的函數是否匹配了。


2.   question:vector數組越界訪問什麼時候會崩潰?

實驗程序一:

vector<int>arr(4);
arr[5] = 4;
cout<<arr[5]<<endl;
for(vector<int>::iterator it = arr.begin(); it<= arr.end(); it++)
{

*it = 1;

cout<<*it<<" ";

}
cout<<endl;

實驗程序二:

vector<string>arr(2);
arr[0] = "hello";
arr[1] = "world";
cout<<arr[2]<<endl;

試驗程序三:

class A{
public:
int x;
A(){
cout<<"hello"<<endl;
};
A(int a): x(a){}
};
int main(){
vector<A> arr(1);
arr[0] = A(1);
cout<<arr[2].x<<endl;
return 0;

answer:程序一 把 *it = 1註釋掉就沒有崩潰,第二個程序崩潰了,第三個程序沒有崩潰。

                 說明vector用指針方式賦值或內部元素帶有指針越界房訪問會崩潰。


3.  程序找錯:

vector<int>arr(1);
for(vector<int>::iterator it_2 = arr.begin(); it_2!= arr.end(); ++it_2)
{

if(*it_2 % 2 == 0) 

{

cout<<*it_2<<" ";

arr.erase(it_2);

}

}

answer::這裏由於!=發生了崩潰,但如果把arr.erase,因爲erase的原因會把end()往前梛,當它往前梛,然後arr.++it_2,那麼他兩就剛好錯過去了,

此時arr.end() < it_2,然後指針越界訪問。


4. 使用vector是報了這樣的錯誤

error C2143: syntax error : missing ';' before '<'
error C2501: 'vector' : missing storage-class or type specifiers
error C2059: syntax error : '<'
error C2238: unexpected token(s) preceding ';'

這種錯誤很隱蔽。改正:引入頭文件#include <vector> 並using namespace std;


5. "int a" (?a@@3HA) already defined in Game.obj

    問題描述: 我在頭文件中int  a = 10;在別的地方引入了這個頭文件,報了這個錯誤。

    answerC++靜態數據成員其實就是類域中的一個全局變量,它的定義也就是初始化是不應該被放在頭文件中的。把初始化放到.cpp文件中就好了。

而且在頭文件中定義static修飾的變量,那麼各個包含該頭文件的文件各自擁有一份拷貝。


6.  switch(1){
cout<<"asdf"<<endl;
}

這樣的如果沒有case或者default,vc6.0會報error,如果執行不輸出。如果是其他IDE中就難以發現這個問題了,比如我就在Qt程序中遇到了。


7. 頭文件中定義的類,如果有是static變量,那麼要放到cpp中初始化,不能在頭文件中。

8. 邏輯運算與位運算不一樣,就如“!"與”~“,一個是非,即如果a = 2; 那!a = 0; ,另一個是取反,!a = 11111100b

    邏輯運算有&&、||、!        位運算有&(與)、|(或)、~(取反)、^(異或)





發佈了100 篇原創文章 · 獲贊 12 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章