C/C++ 面试前 遇到问题总结

来源:互联网 发布:php pdo mysql 编辑:程序博客网 时间:2024/04/30 12:49

《钱能的书》18.7 赋值运算符

拷贝构造函数和赋值运算符的区别:

当拷贝构造函数执行时,newMC对象还不存在,拷贝构造函数起初始化作用。

当赋值运算符在newMC上执行时,它已经是一个MyClass对象。

在拷贝构造函数中,我们碰到浅拷贝和深拷贝的问题。赋值运算符也同样,什么时候浅拷贝不适合,就应该提供成员赋值运算符。

为什么赋值运算符operator = ()的返回类型应该是引用类型XX&

因为返回的不是引用的话,该值将会是对象的一个复制,并不是对象本身,但C++要求赋值表达式左边的表达式是左值。

对赋值运算符说明为保护或私有的作用:

可以将赋值操作限定在类的作用域范围,防止应用程序中使用赋值操作

小结:

1 使用运算符重载可以使程序易于理解并易于对对象进行操作。

几乎所有的C++运算符都可以被重载,但应注意不要重载违反常规的运算符。

不能改变运算符操作数的数量,也不能发明新运算符。

2 如果在类中没有说明本身的拷贝构造函数和赋值运算符,编译程序将会提供,但它们都只是对 对象进行成员浅拷贝。

在那些以指向堆空间指针作为数据成员的类中,必须避免使用浅拷贝,而要为类定义自己的赋值运算符,以给对象分配堆空间

3 this指针 指向当前的对象,它是所有 成员函数 的不可见参数,在重载运算符时,经常返回this指针的间接引用

4 通过 转换运算符 可以在表达式中使用不同类型的对象。

转换运算符 不遵从函数应有返回值类型的规定,与构造函数和析构函数相同,它没有返回值。

5 在前增量 和 后增量运算符 定义中,使用int形参只是为了标志前后有别,没有其它作用

6 拷贝构造函数 用已经存在的对象创建一个相同的新对象。 而赋值运算符把一个对象的成员变量值 赋予一个已经存在的同类对象的 同名变量

《primer》7.2.2 引用形参

从C语言背景转到C++的程序员习惯通过 传递指针 来实现对 实参 的访问。

在C++中,使用 引用形参 则更安全和自然

Const引用的作用:

Bool is isshorter(const string &s1, const string &s2)
{
Return s1.size}

其每一个形参都是const string类型的 引用。

因为形参是引用,所以不复制实参

又因为形参是const引用,所以isshorter函数不能使用该引用来修改实参

为什么const引用币非const引用更灵活:

非const引用形参,既不能用const对象 初始化

也不能用字面值 或者产生 右值的表达式实参 初始化

非const引用形参只能与完全同类型的非const对象关联

所以,应该将不需要修改的引用形参定义为const引用。

形参*&的意思:

Void ptrswap(int *&v1, int *&v2)

{

Int *temp = v2;

V2 = v1;

V1 = temp;

}

形参int *&v1的定义应该从右向左理解:v1是一个引用,与指向int型对象的指针相关联,即是一个int*类型的引用

也就是说,v1只是传进ptrswap函数的任意指针的一个别名。

《钱能的书》2.6 I/O流控制

用控制符manipulators可以,对I/O流的格式进行控制。

要使用include

如何控制浮点数值显示

setprecision(n), 控制输出流显示浮点数的数字个数,默认是6

image

image

设置值的输出宽度:

Setw(8),只影响下一个值:

Cout<

<<10

<<20<

结果:

_ _ _ _ _ _1020

或:

Cout<

<

结果:

_ _ _ _ _ _10_ _ _ _ _ _20

输出8进制和16进制

注意怎么让16进制以大写形式输出,setiosflags(ios::uppercase)在iomanip中

image

image

设置填充字符

Setfill 在 iomanip 中

image

image

 

左右对齐输出

使用setiosflags(ios::left)和setiosflags(ios::right)

Dev中默认是右对齐

image

image

强制显示小数点和符号

使用setiosflags(ios::showpoint)强制显示小数点

使用setiosflags(ios::showpos)强制显示符号

image

image

printf("%-20s: %3d",pn->City,pn->Temp)中%-20s的意思:

其中的负号表示左对齐,如果没有负号,默认右对齐,20表示格式宽度

如果是printf("%-5.3s"),其中的3表示截取字符串中的3个字符

《系统程序员成长计划》 1.4 有关回调函数

《C和指针》 13.3 函数指针

函数指针最常用的两个用途

转换表 jump table

作为参数传递给另一个函数

初始化函数指针:

Int f(int);

Int (*pf)(int) = &f

其中,函数指针pf的初始化表达式中的&操作符是可选的,因为 函数名 被使用时总是由编译器把它转换成为 函数指针。

&操作符 只是显示的说明了编译器将隐式执行的任务

函数指针在初始化后可以使用两种方式调用:

image

回调函数:

任何时候,如果你所编写的函数必须能够在不同的时刻执行不同类型的工作,或者执行只能由调用者定义的工作,就可以使用函数指针,这种技巧叫做 回调函数。

许多窗口系统使用回调函数连接多个动作,如拖拽鼠标和点击指定用户程序中的某个特定函数。

其他:

C语言函数定义中函数首部里的形参名必须有吗?

可不可以只写形参类型而不写具体的形参名呢?

答:可以,不过不写名地话就没法直接使用,但可以间接引用,如通过指针

比如:

int main(int, char**)

{

return 0;

}

strdup与strcpy具体的区别是什么?

strdup可以直接把要复制的内容复制给没有初始化的指针,因为它会自动分配空间给目的指针

strcpy的目的指针一定是已经分配内存的指针

strdup用完要free否则 内存泄露

strcpy拷贝到你分配的内存

strdup是这样实现的:

char *strdup(const char *s)
{
  char *t = NULL;
  if(s && (t = (char*)malloc((strlen(s)+1)))
  strcpy(t, s);
  return t;
}

strdup是已经被废弃的函数了,因为用了之后必须要free,而很多程序员会遗忘或者忽视这个问题,造成严重的内存泄漏!new/delete或者 malloc/free要成对使用,即使这样明确的规则,还会有人忘记释放内存空间。所以当strdup和free捆绑使用的时候,有无数的人忘记了 free。

摘自wikipedia

image

image

image

注意:

C++中用,不要用,这样会给出一个警告

C++中,main有int行返回值

容器的end() 函数,ivec.end() 实际上是容器最后一个元素的下一个位置

原创粉丝点击