C++基本知识二

来源:互联网 发布:股票数据怎么看 编辑:程序博客网 时间:2024/04/28 06:03

C++基本知识二

 

20.new创建动态结构时,不能将成员操作符句点用于结构名,因为这种结构没有名称,只是知道他的地址。如果结构标识符是结构名,则使用句点操作符;如果标识符是指向结构的指针,则使用箭头操作符。

 

21.使用newdelete可能不在同一程序单元中,但一定要注意及时delete。但应注意delete的时间,如果以后程序中要用到分配到的内存空间/地址,则应稍后释放,可以不在本函数内释放。但最好能将这两个操作符在同一函数中成对使用。

 

22.前缀递增、前缀递减和解除引用操作符的优先级相同,以从右到左的顺序结合。后缀递增、后缀递减的优先级相同,单臂前缀操作符的优先级高,操作符从左向右结合。

*++p;表示先将++p结合,在解除引用取值。(*p)++先将p解除引用取值,在将取值增一。

*p++;后缀的优先级更高,这意味着将操作符用于p而不是*p,因此对指针递增,然后缀操作符意味着将原来的地址而不是递增后的新地址解除引用。

 

23.逗号运算符不能将两个声明结合起来,因为声明中已经将逗号用于其他用途分配列表中的变量。逗号表达式的值是第二个的值。在所有操作符中逗号的优先级是最低的,例如:

cat=17,20;将被解释为(cat=17),20;也即将cat设为1720不起作用。不过括号的优先级最高,表达式cat=(17,20);将把cat的值设为20,即逗号表达式的值。

 

24.关系、比较运算符不能作用于C风格字符串,因为C风格字符串或字符数组标志的是一个地址。相反,应使用C风格字符串库中的strcmp()函数进行比较。但这些运算符可以用于比较字符,因为字符实际上是整型。

 

25.定义类型别名的方式有两种:预编译define格式和typedef格式。注意这两种方式的区别。

使用define的方式是:# define BYTE char 后边无分号,表明其不是一个句子。预处理器将在编译程序时用char替换所有BYTE

改写为typedef方法为:typedef  char BYTE; 这是一个句子,结尾有分号。还应注意两个方式中类型名原型和别名所在位置的差别。

 

26.cin在读取char值时,与读取其他基本类型一样,cin将忽略空格和换行符。此外,给cin的输入将被缓冲,直到按下回车键后,整个字符序列才会被发送到程序中。

 

27.所有的条件表达式的结果都将被强制转换成bool值,因此,0将被转换为false,非0true;逻辑or操作符(||),如果左侧的表达式为true,则C++将不会去判定右侧的表达式,因为只要一个表达式为true,则整个逻辑表达式的值为真。

逻辑AND操作符(&&),如果左侧为false,则整个表达式值必定为假,在这种情况下,C++将不会再对右侧进行判定。

 

28.注意理解:if((17<age)<35),其中17<age的值要么为真(1),要么为假(0),但总会小于35,因此不论哪种情况下,条件表达式的结果总是真。

 

29.!操作符的优先级高于所有的关系操作符和运算符。逻辑AND操作符的优先级高于逻辑OR操作符。

并不是所有的键盘都提供了用作逻辑操作符的符号,因此,C++标准提供了另一种表示方式,标志为and,or,not都是C++保留字,这意味着不能将它们用作变量名等。他们不是关键字,因为他们都是已经有语言特性的另一种表示方式。

 

30.条件运算符(?:)生成一个表达式,因此是一个值,可以将其赋值给变量或将其放到一个更大的表达式中,例如:int c=(a>b)?a:b;

 

31.由于不能通过键盘输入空字符,因此vin要用别的方法来确定字符串的结束位置。cin使用空白(空格、制表符和换行符)来确定字符的边界。这意味着cin在获取字符数组时只能读取一个单词。读取该单词后,cin将该字符串放到数组中,并自动在结尾添加空字符。

 

32.默认情况下,输出文件流ofstream的对象的open()函数时,若已存在该文件,则该函数将首先截断该文件,即将其长度截断到0---丢弃原来的内容,然后将新的输出加入到该文件中。

 

33.C++对于返回值的类型有一定的限制,不能是数组,但可以是其他任何类型。有趣的是,函数不能直接返回数组,但可以将数组作为结构或对象的组成部分来返回。

 

34.函数调用的处理过程:函数通过将返回值复制到指定的CPU寄存器或内存单元中将其返回。随后,调用程序将查看该内存单元。返回函数和调用函数必须就该内存单元中存储的数据类型达成一致。函数原型将返回值类型告知调用程序,而函数定义命令被调用函数返回什么类型的数据。

 

35.注意函数原型和函数定义的区别。函数原型是一条语句,必须以分号结束。函数原型中的变量名相当于占位符,因此不必与函数定义中的变量名相同。

 

36.C++原型和ASCI C的原型的区别:为与基本C兼容,ANSCI 中的原型是可选的,但在C++中,原型是必不可少的。在C++中,括号为空与在括号中使用关键字VOID是等效的----意味着没有参数。在ANSI C中,括号为空意味着不指出参数----这意味着将在后面定义参数列表。在C++中,不指定参数列表对应使用省略号:void say(…);通常仅当与接受可变参数的C函数(如printf())交互时,才需要这样做。

 

37.C++中,当且仅当函数头或函数原型中,int *aint a[]的含义才是相同的,他们都意味着a是一个指针。因此在函数中用SIZEOF a得到的值为4,故对数组调用要显式地传递数组长度,不能用sizeof a来得出数组的长度。

 

38.传递常规变量时,函数将使用该变量的拷贝;但传递数组时,函数将使用原来的数组。

 

39.注意指针和const的应用。例:int age=10; const int*pt=&age;该语句表明pt指向一个const int ,因此不能使用pt来修改这个值。换句话说,*pt的值为const,不能被修改。但pt的声明并不意味着它指向的值实际上就是一个常量,而只是意味着对pt而言,这个值是常量。我们仍旧可以通过age来修改值。但pt的值(实际为地址)可以修改。再例:

int sloth=3;  int *const finger=&sloth; 最后一个声明中,const的位置与前面的例子不同。这种声明格式使得finger只能指向sloth,但允许用finger来修改sloth的值,也就是说pt(地址)的值不可以修改,但(*pt)的值可以修改。

注意上面两个例子的区别,const的位置的区别。

 

40.如果数据类型本身并不是指针,则可以将const数据或非const数据的地址付给指向const的指针,但只能将非const数据的地址付给非const指针。

 

41.定义一个const数组:const int a[4]={1,2,3,4}; 则禁止将常量数组的地址付给非常量指针将意味着不能将数组名作为参数传递给使用给非常量形参的函数。

 

42.例子:int a=4; const int * const pt=&a;

这句话的意思是pt*pt的值都是常量(对pt来说)。即pt所指向的地址不可以修改,而且也无法用pt来修改(*pt)的值。但仍可以用a 来修改值。

 

43.将二维数组作为形参的一种表示方法如下:

int sun(int (*a)[4], int size);  其中的括号是必不可少的,因为生命int *a[4]; 将声明一个由4个执行int 的指针组成的数组,而不是一个指向有4int组成的数组的指针。

另外,函数参数不能是数组,必须是指针。

还有一种格式,可读性更强:int sum(int a[][4], int size);

上述的两个原型都指出,a是指针而不是数组。还需注意,指针类型指出,他指向由4int组成的数组。因此,指针类型定义列数,这就是没有将列数作为独立的函数参数进行传递的原因。size用来指明行数。

 

44.C风格字符串是以空字符作为结尾的字符数组。因此,包含字符,但不以空字符结尾的char数组只是数组,而不是字符串。

C风格字符串作为参数的函数,实际上传递的是字符串的第一个字符的地址。这意味着字符串函数原型应将其表示字符串的形参声明为char*类型或char a[]

 

45.声明函数指针的方法是:double (*pf)(int); double *pf(int); 只是一个普通函数,返回一个double型指针。通常,要声明指向特定类型的函数的指针,可以先编写这种函数的原型,然后用(*pf)替换函数名即可,这样pf就是这类型函数的指针。

函数名即为函数地址,因此可以将函数名付给函数指针,如:

double pam(int);//函数声明  double (*pf)(int);  pf=pam;  double x=pf(5);x=(*pf)(5);

当将函数指针作为参数传递的例子如下:

void est(int lines, double (*pf)(int));

则使用时只要将函数地址传递过来即可,est(50,pam);

 

原创粉丝点击