1. class Book{
private:question:爲什麼編譯錯誤?'print' : function does not take 1 parameters
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;
}
雖說當派生類與基類有同名成員時,派生類中的成員將屏蔽基類中的同名成員。所以派生類void print()將基類的void print(int m)屏蔽了。
但是根據子類對象中查找某個標識符的步驟:
1. 首先查找本類函數作用域; 2. 查找函數外圍作用域; 3. 再往外擴大到class Base作用域
4. 再往外擴大到Base所在的namespace作用域 5.最後,查找全局作用域
所以應該還是能夠找到void print(int m)的啊?
重載關係嗎?如果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;在別的地方引入了這個頭文件,報了這個錯誤。
answer: C++靜態數據成員其實就是類域中的一個全局變量,它的定義也就是初始化是不應該被放在頭文件中的。把初始化放到.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
邏輯運算有&&、||、! 位運算有&(與)、|(或)、~(取反)、^(異或)