内容翻译自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>