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关键字的作用是什么?

解答:    当需要在const方法中修改对象的数据成员时,可以在数据成员前使用mutable关键字,防止出现编译出错。例子如下:

代码语言:javascript代码运行次数:0运行复制
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