疑问 实验 错误 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

    逻辑运算有&&、||、!        位运算有&(与)、|(或)、~(取反)、^(异或)





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值