编程错题本(待添加)

1.多在函数参数中使用const &.

2.删除const对象:尽管不能改变const对象的值,但可撤销对象本身.比如 delete pci.

3.string的erase函数的使用:

当i为int类型时,想要删除s[i]时: s.erase(i,1); //如果忘记1,则erase会把s删光的

当i为iterator时,直接使用s.erase(i);  
vector中只有iterator的用法.

4.一般在.h中声明函数,在cpp中定义函数.而类比较特殊,可以将函数在类中直接实现.

5.switch...case中如果要在多个case下定义同名的局部变量,则需要将case下的部分用{}括起来,因为C++中将switch当做一个代码块,而非case.

6.静态全局变量只是在本文件中使用;而全局变量可以跨文件使用.

7.STL中的unique(无论是algorithm中还是list中的)的作用是去除连续位置相同的元素,如果不连续的相同元素是去除不掉的.比如数组内容为:

  10 20 20 20 30 30 20 20 10

   algorithm中处理后,内容变为

 10 20 30 20 10 ? ? ? ?  //?表示内容未知的值

 list中unique处理后,内容变为

 10 20 30 20 10

8.注意左移和右移操作的优先级小于加减操作.如果不加括号, long lo = m << 2 + n << 1; //默认变成 m<<(2+n)<<1;

9. 报异常有可能是你宏观使用的方法有误,此时寻找报错点有可能没有太多作用.比如你使用某个库或者别人封装的函数去实现读写的功能,报一些不知所云的操作,有可能是你用的方式不对,而非是被调用方法有问题.

10. 记住一些互为对照的过程,比如读和写; 不知道是什么规则时,选择不去没有根据的尝试,而是看人家是怎么做的.

11. 如果出现段错误,可能的原因: 溢出;  某对象内容为空;  调用方和被调用方接口不一致(比如修改接口后没有重新编译).

12.sizeof(char *)指的是char *指针的大小;sizeof(char[])指的是char[]数组的长度.如果想要char*的长度则采用strlen().

13.如果发现程序没有按照预想的逻辑运行,而是有离奇的跳转,考虑是不是有抛出异常,导致程序发生该问题.

14.STL的vector中没有remove方法,而Qt中有该方法remove(int i)。它在Qt中作用是删除下标为i的元素,直接移除掉,影响size().如果想要移除多个下标,可以采用倒序的方式,这样就避免了下标错乱的问题。

15. 指针定义之后,要进行初始化。可以直接通过new的方式指向堆上内存,也可以直接指向已有的栈上的位置。指针保存的是另一个对象的地址。 

最佳实践:如果可能先定义对象,然后再定义指针,防止未初始化。若需要分开定义指针和所指对象,则将指针初始化为0.未初始化的指针会指向随机的地址,造成问题。

16.深拷贝的实现手法:

vector<Node *> vecNode;//已初始化,假设有5个元素。

Node *pNode = new Node(*vecNode[0]); //深拷贝,通过new的方式。这样对pNode修改不会影响vecNode

17. 友元:

允许特定的非成员函数访问一个类的私有成员,同时仍然阻止一般的访问。

18.跨模块调用遇到的问题:

我在exe中修改dll中某个导出类的对象,发现直接对其成员变量修改不成功(public类型的),需要使用set函数才可以成功。未找到原因。

19.指针初始化为0后,不能够对其所指内存操作。另外在确定指针指向前,不要对其解引用赋值。

int *p = nullptr;
*p = 1; //这是错误的,不可以对0地址的内容进行修改,报SIGSEGV段错误

//正确写法:
int *p = nullptr;
int i = 1;
p = &i;

//不推荐的写法:在qt下可以运行起来,但在gdb下会报SIGSEGV段错误。
int *p;
*p = 1;

20. 在类B中将类A的指针pA作为其成员变量,在B.h中使用class A;的前向声明,而在B.cpp中使用了pA->fun();一直报错invalid use of imcomplete type 'class A'. 后来找到原因是B.cpp中没有把A.h包含进去。 

gains: 在声明指针时,可以使用前向声明,因为只需要保存一个指针变量;而在使用指针调用函数时,则需要知道类的详细信息,否则去哪里找函数呢

21.分清真引用和假引用:

//返回引用类型的函数
const A& GetRef()
{
   return m_A;
} 

//假引用
const A a1 = GetRef(); //实际上还是会值拷贝

//真引用
const A& a2 = GetRef();//不会值拷贝

22.new生成的局部变量指针,该怎么释放呢?

   可以定义一个vector类型的成员变量,把局部变量指针加到vector中,最后再析构函数中delete掉,最后再把vector内容clear()掉。这里的clear()是必要的,如果意外访问到vector中被delete掉的元素内容时,会发生崩溃的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodingLife99

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值