c++笔记4-注意的问题

1,构造和析构,是c++必然会执行的,这里要注意。

结果:

这个例子,单纯看执行情况和语法没错误,但是有的问题的是bye  应该调用3次,但是只调用了2次。

正确的做法是:改基类的析构函数为虚函数,

下面这句话  uObj在析构的时候才会正确调用RealObject的析构函数(如果不是虚的析构函数,只会调用Object本身的析构函数)

题外话,对于下面的shared_ptr,如果基类不是虚的析构函数,也会调用RealObject的析构函数,这点上和unique_ptr有所不同,但是,为了保险起见,建议还是基类的析构函数还是虚函数。

更改为:

执行结果:

 2,内存方面

1)下图,正常情况没问题。但是有瑕疵,没做检查。

2)下图有问题,因为new的是数组,所以应该delete掉数组

更改为:

3)错误,remakeRoom里面资源泄露了,应该传引用

4)nameInfo返回的时候,就被析构了,所以在testInfo函数里面得到的返回值实际上没有,运行起来会出现任何未定义情况

3,vector相关的常用操作

前言:remove()函数

   #include <iostream>     // std::cout
   #include <algorithm>    // std::remove
 int main() {
    int myints[] = { 10,20,30,30,20,10,10,20 };      // 10 20 30 30 20 10 10 20 

                                                // bounds of range:
    int* pbegin = myints;                          // ^
    int* pend = myints + sizeof(myints) / sizeof(int); // ^                       ^

    pend = std::remove(pbegin, pend, 20);         // 10 30 30 10 10 ?  ?  ?
                                                  // ^              ^
    std::cout << "range contains:";
    for (int* p = pbegin; p != pend; ++p)
        std::cout << ' ' << *p;
    std::cout <<'\n'<< "以上是第一次执行remove函数"<<'\n';

    std::cout<<'\n' << "以下是执行remove函数之后,数组里面的变化" << '\n';
    for (int* t = myints; t != (myints + sizeof(myints) / sizeof(int)); ++t)
        std::cout << ' ' << *t;
    std::cout << '\n';

    std::cin.get();
    return 0;
}

执行结果:

解释:

pend = std::remove(pbegin, pend, 20);    //remove函数会返回一个指针
                                                  //参数pbegin数组指针头,参数pend数组指针尾部+1,参数20是要移动的值
                                                  //数组里的20并不会删除掉,而是将20的值排到了数组的最后面,而且数值会乱
                                                  //返回值pend是排序后的数组,除了20以外的其他值的,最后一个指针+1的指针
                                                  //下面打印数组的元素也会发现,20元素并没有删除,而是排到了最后面
                                                  //猜想:为什么没有删除,而是排到了最后面,而且数值还乱码了,岂不是没用的数组了吗
                                                  //猜测的原因,因为stl里面的容器有自己的删除元素的方法,所以标准算法,不做删除,只做删除的准备工作,降低实现难度。

正题开始:

解释:

vector实现删除特定值的元素方法分两步:

第一步,执行remove函数,将删除的元素排到最后面

第二步,执行vector的erase()函数来实现删除指针区域的元素

4,<<  >>:一般情况不要用

5,迭代器的使用

解释:

1)迭代器,用前置++(返回值自身的引用),后置++(返回临时变量)

2),迭代器比较不要用<,因为有的迭代器没有重载<,所以用!=

3),每次计算c.end()会耗费性能,这样写会好些

4)因为数组没有迭代器,所以不通用,那么改成如下,

5)前面都是自己实现,标准库有提供,如下

6,异常处理

猜你喜欢

转载自blog.csdn.net/yuhan61659/article/details/81775991