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

《钱能的书》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面试遇到的问题,C/C++ 面试前 遇到问题总结
imageimage面试遇到的问题,C/C++ 面试前 遇到问题总结

设置值的输出宽度:

Setw(8),只影响下一个值:
Cout< <<10
<<20< 结果:
_ _ _ _ _ _1020
或:
Cout< < 结果:
_ _ _ _ _ _10_ _ _ _ _ _20

输出8进制和16进制

注意怎么让16进制以大写形式输出,setiosflags(ios::uppercase)在iomanip中
imageimageimage面试遇到的问题,C/C++ 面试前 遇到问题总结
imageimageimageimage面试遇到的问题,C/C++ 面试前 遇到问题总结

设置填充字符

Setfill 在 iomanip 中
imageimageimageimageimage面试遇到的问题,C/C++ 面试前 遇到问题总结
imageimageimageimageimageimage面试遇到的问题,C/C++ 面试前 遇到问题总结

左右对齐输出

使用setiosflags(ios::left)和setiosflags(ios::right)
Dev中默认是右对齐
imageimageimageimageimageimageimage面试遇到的问题,C/C++ 面试前 遇到问题总结
imageimageimageimageimageimageimageimage面试遇到的问题,C/C++ 面试前 遇到问题总结

强制显示小数点和符号

使用setiosflags(ios::showpoint)强制显示小数点
使用setiosflags(ios::showpos)强制显示符号
imageimageimageimageimageimageimageimageimage面试遇到的问题,C/C++ 面试前 遇到问题总结
imageimageimageimageimageimageimageimageimageimage面试遇到的问题,C/C++ 面试前 遇到问题总结

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的初始化表达式中的&操作符是可选的,因为 函数名 被使用时总是由编译器把它转换成为 函数指针。
&操作符 只是显示的说明了编译器将隐式执行的任务
函数指针在初始化后可以使用两种方式调用:
imageimageimageimageimageimageimageimageimageimageimage面试遇到的问题,C/C++ 面试前 遇到问题总结
回调函数:
任何时候,如果你所编写的函数必须能够在不同的时刻执行不同类型的工作,或者执行只能由调用者定义的工作,就可以使用函数指针,这种技巧叫做 回调函数。
许多窗口系统使用回调函数连接多个动作,如拖拽鼠标和点击指定用户程序中的某个特定函数。

其他:

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
imageimageimageimageimageimageimageimageimageimageimageimage面试遇到的问题,C/C++ 面试前 遇到问题总结
imageimageimageimageimageimageimageimageimageimageimageimageimage面试遇到的问题,C/C++ 面试前 遇到问题总结
imageimageimageimageimageimageimageimageimageimageimageimageimageimage面试遇到的问题,C/C++ 面试前 遇到问题总结

注意:

C++中用,不要用,这样会给出一个警告
C++中,main有int行返回值
容器的end() 函数,ivec.end() 实际上是容器最后一个元素的下一个位置
Tags: 

延伸阅读

最新评论

发表评论