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
逻辑运算有&&、||、! 位运算有&(与)、|(或)、~(取反)、^(异或)