您的位置:首页 > 编程语言 > C语言/C++

c++备忘1

2017-01-18 21:24 316 查看
1. c++之所以伟大是因为它同时支持三种编程模式:面向过程,面向对象,范型编程,从而满足程序员的各种需求。

++表明c的超级、扩展。

 

2.计算机需要处理:数据和算法。

其中,面向过程注重算法。面向对象注重数据的属性及操作。范型注重数据类型

 

3.c++11特性,从4.3版本g++需要增加标记-std=c++0x

g++ -std=c++0x test.cpp

 

4. c++头文件没有.h,而保留的c库函数则包含.h或者前缀c

 

5.cin>> 其中的>>实现了操作符的重载,不然表明的是移位

 

6. using namespce std;

using std::cout;

 

7. 变量名尽量不要以_或者__开头,属于保留名称。合法,但不建议

 

8.int data={} c++11的初始化,不包含内容则为0

int data{}

int data{1}

char c{31325} 错误,不允许缩窄

char c{x} 错误,x必须为常量

int data[10]{1}第一个元素初始化为1,其余为0

string st{"test string"}

 

9. short sam=SHORT_MAX;

sam++;

超出范围,sam由32767变为-32768

 

10. 42 表示十进制

042表示八进制

0x42表示十六进制

cout<<hex

cout<<oct

 

11常量后缀

2l表示long

2u表示unsinged int

2ul表示unsigned long

2ll表示long long

2ull表示unsigned long long

 

12 cout.put 可以代替cout<<

 

13 \a 为振铃符

\b为退格符,光标后退,如果签名输出____,则可以实现下面功能:

请输入姓名:_l__

 

14 char 默认既不是无符号,也不是有符号的,需要显示制定,signed char 或者unsigned char

有时字符不能8位表示,则使用wchar_t,则输入输出为wcin,wcout

wchar_t c = L'P';

前缀L表示宽字符

 

c++11 增加了char16_t, char32_t.

前缀u表示16的char,U表示32位的char

 

15 尽量使用const替换#define

 

16.float的精度位小数点后6位

double为小数点后15位

a=2.34e+022

a++没有意义

 

17. 11.17+50.25=61.42

但是输出时结果为61.419998,因为保证6位精度

 

18. int a[2];

sizeof(a)返回字节数,8

 

19. cin>> 遇到换行符停止,丢弃空格和换行符

cin.getline 遇到换行符停止,丢弃换行符

cin.get 遇到换行符停止,保留,需要再次调用cin.get吸收掉空白符

 检测EOF

cin.fail()==true

cin.eof()==true

if(!cin.get())返回istream对象,转换后为true或false

ch==EOF

 

20. 原始字符串

cout<<R"(test "string" here)"

test "string" here

cout<<R"+*("(test "string" here)",test)+*"

"(test "string" here)",test 

 

21. c++允许声明结构体变量时省略struct 关键字

 

22 struct test{

int type;

union{

int aa;

}

}

匿名公用体,则test tt;

tt.aa

 

23 指定占用特定位数的结构体成员

struct ts{

unsigned int SN:4;

bool goodIn:1

}

 

24 指针+1,增加量为指向的类型的字节数

 

25 自动存储: 栈

静态存储:函数外定义,或者static定义,整个生命周期

动态存储:堆

 

26 vector与string使用堆,动态数组

array为栈array<int ,5> data;

int aa[4]={1,3,2,4};

aa=aa+3;

aa[-3]; 等价与 *(aa-3)即aa[0]

array的at()方法将在运行期间捕捉非法索引。出错则中断。

 

27. cout.setf(ios_base::boolalpha) 设置后续显示内容的格式

 

28. y=(4+x++)+(6+x++);

不确定表达式,因为分号为此语句的顺序点,顺序点后为后续语句。c++规定自增子语句会在后续语句执行前自增,但是是否每个子语句执行后处理不确定。因此不建议此表达式。

 

29. 逗号为顺序点,从左到右执行。整个表达式的值为最右边

cat=17,240

表达式值为240

计算顺序(cat=170),240

 

30. 延迟程序while计数浪费cpu

使用ctime的clock()函数,但是该函数返回不一定为秒,返回时钟时间

start=clock()

clock_t delay=5*CLOCKS_PER_SEC

clock()-start<delay

 

31. c++11 基于范围的for

double prices[3]={1.0,2.0,2.0}

for(double &x:prices)

     x=x*0.5  可以修改,因为引用

 

32.

ifstream inFile;

inFile.good()  无错误,且不是EOF

inFile.fail()

inFile.eof()

inFile.bad()

 

33.

c++

int test(...) 暂时不指定参数列表

int test(void) 参数为空

int test() 同上

c中

int test() 暂时不指定

int test(void) 参数为空

 

34. int const *p 指针指向的内容不变

   int * const p  指针本身不变

double (*pf)(int)  函数指针

double *pf(int) 返回double指针的函数

调用方法:pf(2), (*pf)(2) 两大阵营观点,均支持

 

35. 感谢auto

const double *(*(*pd)[3])(const double *, int) =&pa

等价于

auto pc = &pa

 

36.

int rat;

int &aa;

aa=rat; 错误,必须声明引用时初始化

double &&a=std::sqrt(2.0) 右值引用,当右边为表达式时

double &a=x+y 错误

double &&a=x+y 正确

const double &a=x+y正确,见11,const引用生成临时变量,然后赋值

函数返回局部变量,没问题,拷贝副本

函数返回局部变量的引用,错误,内存不存在

 

37

 const可以接收非const参数

const 引用,必要时生成临时变量

 

38

 int func(int a, int b=1, double c) 错误,从右往左设置默认值,c需要先赋值

 

39

函数重载看特征标,参数个数类型,返回不看。

const返回或者参数,均属于特征标。

 

40

函数模板

正常模板

template<typename(class) T>

void func(T &a, T &b)

{

    body.

}

模板可以重载,处理方法一样

有时模板无法处理某些数据类型。算法可能不一样,此时需要显示具体化。

template<> void funct<int>(int &a, int &b); 遇到int时,优先调用这个模板

 

显示实例化,遇到下面int类型时,则调用模板的int版本。

template void funct<int>(int ,int);  遇到char时,优先实例化此模板

显示具体化:属于模板

显示实例化:属于实例,模板的一个实例

 

41

 auto 结合 decltype

template<class T1, class T2>

auto funct(T1 a, T2 b)->decltype(a+b)

auto表明函数有返回值

decltype表明返回类型为括号表达式返回的类型

 

42

. 作用域:文件外,文件内,函数或者语句块内

持续性:自动变量,静态存储,线程存储,动态存储

 

43

. 静态变量在运行期间保持不变,因此不需要栈来管理,编译器分配固定内存,默认初始化为0.

分三种:1. 全局变量(外部使用需要extern) 2 文件内函数外的static变量 3. 函数内的static

未执行已经在内存中。

 

44.

说明符:

register,static,extern,thread_local,mutable  同一声明只允许有一个说明符,thread_local除外,可与static,extern结合

cv限定符:

const:全局变量链接性为内部的,类似static

volatile:即使代码没有对修饰的变量没有改动,其值也可能被修改,一般编译器第二次访问某个变量会优先访问缓存,这是一种优化。此关键字将避免这种优化。

mutable:即使结构体或者类为const,其修饰的某个成员也可以被修改。

 

45. 定位new运算符

char buffer[BUF]

double *p1 = new double
;  --------heap

double *p2 = new (buffer)double
;---------use buffer place

p1[0]=p2[0]=1.0;

double *p3 = new double
;--------new heap

double *p4 = new (buffer)double
; ---------overwirite old place

double *p5=new (buffer+N*sizeof(double))double
;-----new place

 

46. cin>>fetch;----局部变量

cin>>::fetch;-----全局变量

cin>>Tom::fetch;------Tom命名空间成员

 

47

 namespace

{

int cnt;

}

等价与static int cnt;

匿名空间替换内部静态变量

 

48. using 指令,声明的函数为重载时,则导入所有版本。

 

49. oop编程,不仅考虑如何表示数据,而且考虑如何使用数据

 

50

Stock food=Stock("111");//显示调用构造函数,且产生临时对象后复制

Stock food("111"); //隐式调用

Stock *food = new Stock("111");

Stock food{"111"}//C++11初始化

Stock food();错误

Stock food = Stock();错误

如果调用默认构造函数应使用Stock food; Stock food = Stock; Stock food{};

 

51.

class stu{

public:

 void show();

}

const stu s;

s.show();错误,因为show函数可能会改变s

弥补方法:定义show为const,位于函数右边

class stu{

public:

 void show() const;//注意时括号后面,其他位置不行

}

只要类方法不修改调用对象,就应该定义为const类型。

 

52

class stu

{

private:

const int N=10;

double data
;//错误,因为const初始化需要空间,而类声明时没有空间

}

解决方法a

class stu

{

private:

enum{N=10};

double data
;//正确,因为枚举作用域为整个类,枚举不再对象的空间中

}

方法b

class stu

{

private:

static const int N=10;

double data
;// static不存储在对象中,而是在静态数据区

}

 

53

c++11提供了作用域内的枚举

enum class egg{small, middle, large};

就保证了egg::small这个枚举量的范围,不会与其他同名枚举量冲突。

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: