C++ 易混易错总结

2020-03-30  本文已影响0人  陈星空
  1. 数组名&指向数组的指针
int a[3] = {1,5,10};
cout << a << endl;
cout << *a << endl;
cout << *a + 1 << endl;
cout << *(a + 1) << endl;
cout << (*a) + 1 << endl;

结果表明*a+1=(*a)+1

0133FB90
1
2
5
2

  1. 默认形参
void print(int b, int c, int d = 2, int a = 1)
{
    cout << b << endl;
    cout << c << endl;
    cout << d << endl;
    cout << a << endl;
}

结果表明:
1)默认形参需要放到形参列表最后面,否则编译报错void print(int b=1, int c, int d = 2, int a = 1)
2)默认形参可以不给值,也可以给值,其他必须传值

print() 编译错误
print(1) 编译错误
print(1,2,3) 正确
print(1,2,3,4) 正确

  1. 拷贝构造和赋值构造的调用
    调用的是拷贝构造函数还是赋值运算符,主要是看是否有新的对象实例产生。如果产生了新的对象实例,那调用的就是拷贝构造函数;如果没有,那就是对已有的对象赋值,调用的是赋值运算符。

调用拷贝构造函数主要有以下场景:
对象作为函数的参数,以值传递的方式传给函数。 
对象作为函数的返回值,以值的方式从函数返回
使用一个对象给另一个对象初始化

实例:

class AA
{
public:
    AA()
    {
        cout << "默认构造" << endl;
    }
    AA(int a)
    {
        cout << "有参构造" << endl;
    }

    AA(const AA& aa)
    {
        _data = aa._data;
        cout << "拷贝构造" << endl;
    }

    AA& operator=(const AA& aa)
    {
        cout << "赋值构造" << endl;
        _data = aa._data;
        return *this;
    }

private:
    int _data;
};


int main()
{
    AA a1(1);
    AA a2(a1);
    AA a3;
    a3 = a1;
    AA a4 = a2;
    a2 = a1;
    return 0;
}

结果

有参构造
拷贝构造
默认构造
赋值构造
拷贝构造
赋值构造

  1. vector操作

1)resize不会改变capacity大小,只会改变size大小
2)删除空间需要clear+shrink_to_fit
3)reserve只可以改变capacity大小,不会改变size大小


image.png

实例:

    vector<int> v;
    cout << v.size()<<" "<<v.capacity() << endl;
    v.resize(10, 1);
    cout << v.size() << " " << v.capacity() << endl;
    v.resize(3, 2);
    cout << v.size() << " " << v.capacity() << endl;
    v.reserve(20);
    cout << v.size() << " " << v.capacity() << endl;

0 0
10 10
3 10
3 20

上一篇 下一篇

猜你喜欢

热点阅读