admin管理员组文章数量:1487745
【C/C++笔记】:易错难点2
基础知识点
1. 易误解:如果int a[5], 那么a与&a是等价的,因为两者地址相同。
解答: 一定要注意a与&a是不一样的,虽然两者地址相同,但意义不一样,&a是整个数组对象的首地址,而a是数组首地址,也就是a[0]的地址,a的类型是int[5],a[0]的类型是int,因此&a+1相当于a的地址值加上sizeof(int) * 5,也就是a[5],下一个对象的地址,已经越界了,而a+1相当于a的地址加上sizeof(int),即a[1]的地址。
2. 如何在类中定义常量成员并为其初始化?
解答:只能在初始化列表里对const成员初始化,像下面这样:
代码语言:javascript代码运行次数:0运行复制class CBook {
public:
const double m_price;
CBook() :m_price(8.8) { }
};
下面的做法是错误的:
代码语言:javascript代码运行次数:0运行复制class CBook {
public:
const double m_price;
CBook() {
m_price = 8.8;
}
};
3. 在定义类的成员函数时使用mutable关键字的作用是什么?
代码语言:javascript代码运行次数:0运行复制解答: 当需要在const方法中修改对象的数据成员时,可以在数据成员前使用mutable关键字,防止出现编译出错。例子如下:
class CBook {
public:
mutable double m_price; // 如果不加就会出错
CBook(double price) :m_price(price) { }
double getPrice() const; // 定义const方法
};
double CBook::getPrice() const {
m_price = 9.8;
return m_price;
}
4. 在C++中,如果确定了某一个构造函数的创建过程,在该构造函数中如果调用了其它重载的构造函数,它将不会执行其它构造函数的初始化列表部分代码,而是执行函数体代码,此时已经退化成普通函数了。
样例代码如下:
代码语言:javascript代码运行次数:0运行复制class CBook {
public:
double m_price;
CBook() {
CBook(8.8);
}
CBook(double price) : m_price(price) { }
};
int main() {
CBook c;
cout << c.m_price << endl; // 此时并不会输出理想中的8.8
}
选择题
1. 函数栈数组越界覆盖问题
下面程序输出什么:
正确答案:
代码语言:javascript代码运行次数:0运行复制int function(const int src[16]){
int val1=0;
int dst[16]={0};
int val2=0;
const int *psrc=src;
//问题1:如下代码行输出什么?
fprintf(stdout,"size of src=%lu\n",sizeof(src));
//问题2:如下代码有什么副作用?
for(int i=0;i<=16;i++){
dst[i]=*psrc+i;
psrc++;
}
return 0;
}
A.16,val2会被覆盖 B.其他三项都不对 C.8,val2会被覆盖 D.8,val1会被覆盖
解析:
本文标签: CC笔记易错难点2
版权声明:本文标题:【CC++笔记】:易错难点2 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/shuma/1754826004a3180082.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论