分类: C/C++
2012-04-11 00:56:00
当拷贝构造函数执行时,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) 其每一个形参都是const string类型的 引用。 因为形参是引用,所以不复制实参 又因为形参是const引用,所以isshorter函数不能使用该引用来修改实参 非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函数的任意指针的一个别名。 用控制符manipulators可以,对I/O流的格式进行控制。 要使用include setprecision(n), 控制输出流显示浮点数的数字个数,默认是6 Setw(8),只影响下一个值: Cout< <<10 <<20< 结果: _ _ _ _ _ _1020 或: Cout< < 结果: _ _ _ _ _ _10_ _ _ _ _ _20 注意怎么让16进制以大写形式输出,setiosflags(ios::uppercase)在iomanip中 Setfill 在 iomanip 中 使用setiosflags(ios::left)和setiosflags(ios::right) Dev中默认是右对齐 使用setiosflags(ios::showpoint)强制显示小数点 使用setiosflags(ios::showpos)强制显示符号 其中的负号表示左对齐,如果没有负号,默认右对齐,20表示格式宽度 如果是printf("%-5.3s"),其中的3表示截取字符串中的3个字符 函数指针最常用的两个用途 转换表 jump table 作为参数传递给另一个函数 初始化函数指针: Int f(int); Int (*pf)(int) = &f 其中,函数指针pf的初始化表达式中的&操作符是可选的,因为 函数名 被使用时总是由编译器把它转换成为 函数指针。 &操作符 只是显示的说明了编译器将隐式执行的任务 函数指针在初始化后可以使用两种方式调用: 回调函数: 任何时候,如果你所编写的函数必须能够在不同的时刻执行不同类型的工作,或者执行只能由调用者定义的工作,就可以使用函数指针,这种技巧叫做 回调函数。 许多窗口系统使用回调函数连接多个动作,如拖拽鼠标和点击指定用户程序中的某个特定函数。 可不可以只写形参类型而不写具体的形参名呢? 答:可以,不过不写名地话就没法直接使用,但可以间接引用,如通过指针 比如: int main(int, char**) { return 0; } strdup可以直接把要复制的内容复制给没有初始化的指针,因为它会自动分配空间给目的指针 strcpy的目的指针一定是已经分配内存的指针 strdup用完要free否则 内存泄露 strcpy拷贝到你分配的内存 strdup是这样实现的: char *strdup(const char *s) strdup是已经被废弃的函数了,因为用了之后必须要free,而很多程序员会遗忘或者忽视这个问题,造成严重的内存泄漏!new/delete或者 malloc/free要成对使用,即使这样明确的规则,还会有人忘记释放内存空间。所以当strdup和free捆绑使用的时候,有无数的人忘记了 free。 摘自wikipedia C++中用,不要用,这样会给出一个警告 C++中,main有int行返回值 容器的end() 函数,ivec.end() 实际上是容器最后一个元素的下一个位置
{
Return s1.size
{
char *t = NULL;
if(s && (t = (char*)malloc((strlen(s)+1)))
strcpy(t, s);
return t;
}