C++学习(18)

来源:互联网 发布:mysql安装后连接不上 编辑:程序博客网 时间:2024/06/03 14:00

1、编译下列程序,分析运行结果:

#include<iostream>#include<cstdlib >using namespace std;void fun(int *p1,int *p2,int *s) {//s=(int *)malloc(sizeof(int));//cout<<s<<endl;*s = *p1 + *(p2++);//cout<<*s;}int main() {int a[2]={1,2},b[2]={0,20},*s=a;//cout<<s<<endl;fun(a,b,s);//cout<<s<<endl;cout<<*s<<endl;}
分析:

当调用fun(a,b,s);传进的参数实际上是:&a[0], &b[0], s变量的值(实际上也就是&a[0]现在把fun的形参换个名字  fun(int *p1, int *p2, int *p3) 进入fun p3 = s ,p3 = &a[0]. 调用malloc时返回的值是一个int*,实际上 p3 = malloc返回的新指针p4 *p3=*p1+*(p2++)     *p4=*p1+*(p2++);  p4并不是s,算出来的值赋值到malloc返回的指针p4指向的内存了。若想p3(即s)拿到计算的值,把s=(int*)malloc(sizeof(int) );这句去掉即可得到11

 

fun函数中,指针s实际上是实参s的一份拷贝。对指针s值得改变,并不会改变实参s的值。通过调用malloc,给指针s赋值上新的地址,之后对指针s所指向内存的修改不会对实参s所指向的内存产生影响。

所以,fun函数执行后,对指针s的值和s所指向的内存不会产生任何影响。

 

2C++规定:

++a前缀运算符a.operator()不需要加参数。
a++后缀运算符 a.operator(int)需要加参数。

前置operator++();operator--();后置operator++(int);operator--(int);


3、通常静态数据成员在类声明中声明,在包含类方法的文件中初始化.

初始化时使用作用域操作符来指出静态成员所属的类.

但如果静态成员是整型或是枚举型const,则可以在类声明中初始化!!

如果改成有的静态数据成员是可以直接在类中初始化。

 

4C++32位单精度浮点数能表示的十进制有效数字是7位

分析:一个浮点数由三部分组成:符号位S、指数部分E(阶码)以及尾数部分M

 

单精度浮点数(float)总共用32位来表示浮点数,其中尾数用23位存储,加上小数点前有一位隐藏的1(IEEE754规约数表示法)2^(23+1) = 16777216。因为 10^7 < 16777216 < 10^8,所以说单精度浮点数的有效位数是7。考虑到第7位可能的四舍五入问题,所以单精度最少有6位有效数字(最小尺寸)。 

 

同样地:双精度浮点数(double)总共用64位来表示浮点数,其中尾数用52位存储, 2^(52+1) = 900719925474099210^16 < 9007199254740992 < 10^17,所以双精度的有效位数是16位。同样四舍五入,最少15

 

5、由多个源文件组成的C程序,经过编辑、预处理、编译、链接等阶段会生成最终的可执行程序。下面哪个阶段可以发现被调用的函数未定义?链接。

分析:1).编辑:也就是编写C/C++程序。

 

2).预处理:相当于根据预处理指令组装新的C/C++程序。经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内容上有所不同。

 

3).编译:将预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后,产生相应的汇编代码文件

 

4).链接:通过链接器将一个个目标文件(或许还会有库文件)链接在一起生成一个完整的可执行程序。链接程序的主要工作就是将有关的目标文件彼此相连接,也就是将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够被操作系统装入执行的统一整体。在此过程中会发现被调用的函数未被定义。


6、下面对重载乘法运算符的函数原型声明中正确的是:

A、MyClass operator *(double,MyClass);

B、MyClass operator *(MyClass,MyClass);

C、MyClass operator *(double,double);

D、MyClass operator *(MyClass,double);

分析:C++中规定,重载运算符必须和用户定义的自定义类型的对象一起使用。

对于一个运算符函数来说,它或者是类的成员,或者至少包含一个类类型的参数;操作符重载允许将标准C++操作符用于类对象。

 

 

原创粉丝点击