1、头文件用双引号和大于小于号

2、野指针

野指针指向一个已删除的对象或未申请访问受限内存区域的指针。与空指针不同,野指针无法通过简单地判断是否为 NULL避免,而只能通过养成良好的编程习惯来尽力减少。对野指针进行操作很容易造成程序错误。

指针变量未初始化

任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。

指针释放后之后未置空

有时指针在free或delete后未赋值 NULL,便会使人以为是合法的。别看free和delete的名字(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。此时指针指向的就是“垃圾”内存。释放后的指针应立即将指针置为NULL,防止产生“野指针”。

指针操作超越变量作用域

不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。示例程序如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class A {
public:
void Func(void){ cout << “Func of class A” << endl; }
};
class B {
public:
A *p;
void Test(void) {
A a;
p = &a; // 注意 a 的生命期 ,只在这个函数Test中,而不是整个class B
}
void Test1() {
p->Func(); // p 是“野指针”
}
};

函数 Test1 在执行语句 p->Func()时,p 的值还是 a 的地址,对象 a 的内容已经被清除,所以 p 就成了“野指针” 。初始化时置 NULL,释放时置NULL。

3、C++11新特性-使用大括号包围的值列表赋值

除了初始化之外,这种形式也可以用于赋值语句中。先回顾一下初始化变量时的情况:

vector vi{1, 2, 3, 4, 5};

接下来是赋值的情况:

vector vi;
vi = {6, 7, 8, 9, 10};

这种形式,在有限多个数值的赋值时是非常有用的。
和初始化一样,使用大括号包围的值列表也具有同样的优势。首先就是防止窄化,有时可以简单的理解为防止精度降低,例如下面的代码是无法编译通过的:

double pai = 3.1415926;
int pi;
pi = {pai}; //编译错误。

另外,如果大括号里的初始化列表为空,编译器会创建一个值初始化的临时量并赋值给赋值对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/小括号初始化
string str("hello");

//等号初始化
string str="hello";

//大括号初始化
string str{"23333"};

struct Studnet{
char* name;
int age;
};
Studnet s={"dablelv",18}; //纯数据(Plain of Data,POD)类型对象
Studnet sArr[]={{"dablelv",18},{"tommy",19}}; //POD数组

4、std::find ‘error no matching function’

You forgot to #include .

5、Segmentation fault (core dumped)

Segmentation fault (core dumped)出错原因及位置分析
段错误调试神器 - Core Dump详解
《c专家编程》笔记–bus error(总线错误)

6、#include

INT_MIN
INT_MAX

7、C++函数返回多个参数

  1. 第一种方法是将返回值作为写参数。
  2. 第二种方法是定义一个结构,返回指向该结构的指针。

8、c++ set 为什么不能用数组下标的方式获取元素?

因为c++并没有给set这种容器重载[]操作符,所以不像vector一样可以用数组下标访问元素。

Tips: 由于set不能修改容器中的元素,所以ct–操作是先删除(at, ct)再添加(at, ct-1)来实现的。

9、printf(“%d%c”, i, “ \t”[i == 4]);

前面是string类型,后面中括号下标为0或1,前面都是0,最后一个是1,解决了输出空格空行这一历史性难题。

10、begin和cbegin两个函数有什么不同?

如下:
auto i1 = Container.begin(); // i1 is Container::iterator
auto i2 = Container.cbegin(); // i2 is Container::const_iterator

1.iterator,const_iterator作用:遍历容器内的元素,并访问这些元素的值。iterator可以改元素值,但const_iterator不可改。跟C的指针有点像
2.const_iterator 对象可以用于const vector 或非 const vector,它自身的值可以改(可以指向其他元素),但不能改写其指向的元素值.

11、STL之–插入迭代器(back_inserter,inserter,front_inserter的区别)

http://blog.csdn.net/github_35681219/article/details/52564780
可以使用进行数学上的并、排斥运算。

12、cout将bool直接输出为true和false

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//---------------------------------------
//使用boolalpha输出为bool类型
//使用noboolalpha输出为数字类型
//--------------------------------------
#include "stdafx.h"
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
bool test = true;
cout << "the output is number " << test << endl;
cout << "the output is bool(use boolalpha) " << boolalpha << test << endl;
cout << "the output is number(use noboolalpha) " << noboolalpha << test << endl;
system("pause");
return 0;
}
输出:

the output is number 1
the output is bool(use boolalpha) true
the output is number(use noboolalpha) 1
请按任意键继续. . .