C/C++ 面试前 遇到问题总结
2011-05-19 23:23
585 查看
《钱能的书》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
如何控制浮点数值显示
setprecision(n), 控制输出流显示浮点数的数字个数,默认是6![](http://hi.csdn.net/attachment/201105/19/0_13058185952k9r.gif)
![](http://hi.csdn.net/attachment/201105/19/0_1305818596Bo6O.gif)
设置值的输出宽度:
Setw(8),只影响下一个值:Cout
其中的负号表示左对齐,如果没有负号,默认右对齐,20表示格式宽度
如果是printf("%-5.3s"),其中的3表示截取字符串中的3个字符
《系统程序员成长计划》 1.4 有关回调函数
《C和指针》 13.3 函数指针
函数指针最常用的两个用途转换表 jump table
作为参数传递给另一个函数
初始化函数指针:
Int f(int);
Int (*pf)(int) = &f
其中,函数指针pf的初始化表达式中的&操作符是可选的,因为 函数名 被使用时总是由编译器把它转换成为 函数指针。
&操作符 只是显示的说明了编译器将隐式执行的任务
函数指针在初始化后可以使用两种方式调用:
![](http://hi.csdn.net/attachment/201105/19/0_1305818608zUEj.gif)
回调函数:
任何时候,如果你所编写的函数必须能够在不同的时刻执行不同类型的工作,或者执行只能由调用者定义的工作,就可以使用函数指针,这种技巧叫做 回调函数。
许多窗口系统使用回调函数连接多个动作,如拖拽鼠标和点击指定用户程序中的某个特定函数。
其他:
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
![](http://hi.csdn.net/attachment/201105/19/0_1305818609Z9nf.gif)
![](http://hi.csdn.net/attachment/201105/19/0_13058186102x9x.gif)
![](http://hi.csdn.net/attachment/201105/19/0_1305818611H9Nh.gif)
注意:
C++中用,不要用,这样会给出一个警告C++中,main有int行返回值
容器的end() 函数,ivec.end() 实际上是容器最后一个元素的下一个位置
相关文章推荐
- 关于c++面试问题的一些总结
- C++ 写leetcode遇到的一些问题总结string to integer
- C++ 写leetcode遇到的一些问题总结Reverse Words in a String
- Android--面试中遇到的问题总结(三)
- webview的简单总结(最近面试遇到好多这方面的问题)
- c++关于结尾遇到‘\n’或其他特殊字符结束读取的问题(个人总结,大神勿喷)
- 面试中遇到的C++问题(一)
- 我遇到的c++、mfc问题总结(2)
- 常见C++面试问题总结2
- 常见C++面试问题总结1
- C/C++面试遇到的几个知识盲点以及编程问题
- 面试遇到的问题总结(一)
- 面试总结6--C++基础问题Part2
- 黑马程序员——总结第一次面试遇到的问题
- c++一些 面试可能遇到的问题
- 总结面试中遇到的问题(持续更新)
- C++ 关于static variables的学习中遇到的问题总结
- C++ 写leetcode遇到的一些问题总结Implement strStr()
- C/C++面试常见问题总结
- 总结一下最近面试遇到的一些问题吧