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

c++ primer 笔记

2015-10-13 22:02 417 查看
内容翻译自c++ primer 第5版

1. c:\Users\me\Programs> cl /EHsc prog1.cpp

cl 编译

/EHsc 打开标准异常处理

/w4 打开编译警告(-Wall GNU)

2. echo 指令 查看main函数返回值

UNIX $echo $?

Windows $echo %ERRORLEVEL%

3, c++语言没有定义任何去执行输入输出的语句,而是用标准库实现,iostream

cin

cout

cerr

clog

4. #include能否放在函数中(#include<dense> 使用engen时试过,可以的)

5. std::cout << "Enter two numbers:" << std::endl; 为什么可以连续使用<<

因为输出操作符<<返回的结果是左值,上面等价为

(std::cout << "Enter two numbers:") << std::endl; 从左至右执行,输出"Enter two numbers:"后返回std::cout,在执行std::cout<<stdLLendl;

6.在程序中加入输出语句时一定要加上<<std::endl;否则部分调试信息可能还没有输出程序就crash掉了

7. comment

//....................

/* 。。。。。。。。

。。。。。。。。。。。。*/

/*

* Simple example function:

* Read two numbers ad write their sum

*/

8. 控制台表示结束输入 end of file

例如对输入的整数求和,不知道会输入多少个整数

int sum=0;
int val=0;
whlie(cin>>val)
sum+=val;
cout<<"sum is  "<<sum<<endl;


windows ctrl+z + enter

UNIX OSI cotrol+d

9. 书中1.4.4写一个程序计数连续出现整数出现的次数

int currVal=0,val=0;
if(cin>>currVal)
{
int cnt=1;
while(cin>>val)
{
if(currVal == val)
cnt++;
else
{
cout<<"val  "<<currVal<<"  appears  "<<cnt<<"  times"<<endl;
currVal=val;
cnt=1;
}
}

cout<<"val  "<<currVal<<"  appears  "<<cnt<<"  times"<<endl;
}


10. 输出重定向功能

假如一个控制台程序从控制台读取数据,然后将结果输出到控制台,可以在调用程序时加上重定向操作

$ adItems <infile >outfile


11. 两个字符串常量中间用空格、制表符、换行符分隔时,会合并为一个字符串常量

cout<<"I love c++"
" Yes"<<endl;


12. 反斜线加数字表示转义序列,数字只会是8进制或者16进制,不可能是10进制

\123 //1-3为8进制数 所以\19是错的,如果\后面的数字多余3位,前三位作为转义序列,后面的是普通的数字 \1234 => \123 4

\x1234 //对于十六进制数 不限制位数,一位或者多位都行

此处和8进制与16进制数字的表示方法不同

int i=019;//wrong 前面有0说明是8进制, 不会有9出现

int j=0x123// 0X124 0x 0X 后面跟数字表示16进制

13.赋值与初始化不同

初始化是在一个变量创建的时候进行,赋值是创建后进行

cin<<int x;//为什么不对?

int x=y=0;

14.声明与定义

一般变量声明时已经定义,分派内存,如果加上extern 则只声明不定义,不分配内存

如 extern int i;

但是后面加上初始化,就和extern相违背,如果在函数外(全局)可行,在函数内就是错误的。

extern inti(i);

变量可以被声明很多次,但只能被定义一次,在分离式编译(separate compilation)通常声明放在头文件,定义放在cpp文件,如果在其他文件中想使用变量只用包含头文件,即只包含声明,变量实际上只定义了一次。

15, 命名的规定

_不能连续出现

_后不能直接跟大写字母 _A

_起头的命名不能放在函数外

16. 符合类型(compound typing)引用、别名、指针

int &a; //wrong 声明时必须初始化

int b=0;

int &a=b;

一个引用的只能关联一个同类型的对象,关联关系不能更改,必须初始化

指针能指向多个对象,类型要求不严格(父类的指针可以指向子类),可以更改指向关系,可以不初始化

引用不是对象,没有地址,不能被指针指向

int a=0,&b=a;

int *c=&b;//wrong

int *c=&a;//correct

17.指针初始化为空指针的方式有三种

1. int *p=nullptr; //新标准
2. int *p=0;
3. //must #include<cstdlib>
int *p=NULL;//前处理器

int a=0;
int *p=a;// 错误  不能用变量初始化指针  及时值为0


int* p1,p2;//p1 is a pointer, p2 is int object;

*总是跟着名字的 不是类型名称

18. const 常量

默认情况下,const常量仅限于local file,当const由编译时常量(512)初始化,const int bufSize=512;编译时会自动用512替换bufSize的地方(有点像#define)

即使名字相同,在不同的cpp文件中,const变量都是不同的,不相互影响,如果不是const变量(例如全局 int a=0;),会出现重复定义的错误

如果想在不同的文件中share相同的const常量,但是常量不是用常量表达式初始化的,用extern,不加extern,const仅限于local file??

To share a const object among multiple files, you must define the variable as extern.

.h
extern const int a;
.cpp
extern const int a=getVal();


const的引用

const int a=10;

const int &b=a;

int &c=a;//wrong 常量的引用必须为常量

int c=10;

const int &d=c;//正确 可以定义常量的引用关联到非常量的对象上、数值常量、表达式、不同类型的变量上,这都是普通引用不具备的

const int &e=42;

const int &f=c*100;

double dval = 3.14;

const int &ri = dval;

int &g=c*10;//wrong

int errNumb = 0;

int *const curErr = &errNumb; // curErr will always point to errNumb

const double pi = 3.14159;

const double *const pip = π // pip is a const pointer to a const object

从右往左读,const pip说明pip是常量,const double *说明pip是指向常量的指针,合起来及时指向常量的常指针

常指针想定指针表明不能将此指针指向其他的对象,常指针不能保证其指向的对象不会发生更改,"they thought they point or refer to const"

引用和常引用

引用声明时必须初始化,初始化的对象必须是同类型的变量,不能是表达式、常量表达式

常引用声明时也需要初始化,初始化的对象可以是不同类型的变量(先转换为中间变量temp,然后作为中间变量的别名)、表达式、常量表达式等

int a=10;

int &b=a;

int &c=5; int &c=a*5; //wrong

double a=10.2; int &c=a;//wrong

讲上面的int & 改为const int &就完全正确

指针和指向常量的指针

指向常量的指针没有引用那么复杂,不涉及表达式、类型转换等

const int a=10;

const int *p=a;

int *p=a;//wrong

用指向常量的指针指向变量或者用常引用连接变量是可以的,但是通过指针和引用不能修改变量,因为"They thought they refer to or point to const"

因为指针是对象,不像引用只是对象的一个名字,存在常指针,就是指针的地址不不变的

19. 使用typedef和指针时可能出现的问题

typedef char *pstring;

const pstring cstr = 0; // cstr is a constant pointer to char not a point to const char

const pstring *ps; // ps is a pointer to a constant pointer to char

不能直接将pstring替换为char*理解

const char *cstr = 0; // wrong interpretation of const pstring cstr

20.c++中的c库

因为c++兼容c,所以c写的库在c++中也可以用,但也会提供更合适的c++版本,命名会将头文件的.h去掉,再加上c前缀,要尽量使用c++库,因为在c。。定义的名字是包含在std namespace中的。

#include <cmath> v++

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