c++ primer 笔记

内容翻译自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 = &pi; // 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>




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值