1.对于一个空类,例如
class EmptyClass{};
虽然你没有声明任何函数,但是编译器会自动为你提供上面这四个方法。
class EmptyClass {
public:
EmptyClass(); // 默认构造函数
EmptyClass(const EmptyClass &rhs); // 复制构造函数
~EmptyClass(); // 析构函数
EmptyClass& operator=(const EmptyClass &rhs); // 赋值运算符
}
2.为什么赋值运算符要返回引用?
#include<iostream.h>
#include<string.h>
class string{
char *ptr;
public:
string(char *s)
{
ptr=new char[strlen(s)+1];
strcpy(ptr,s);
}
~string(){
delete ptr;
}
void print(){
cout<<ptr<<endl;
}
string operator=(const string &);
};
string string::operator=(const string &s)
{
if(this==&s) return *this;
delete ptr;
ptr=new char[strlen(s.ptr)+1];
strcpy(ptr,s.ptr);
return *this;
}
void main()
{
string p1=("book");
{
string p2("pen");
p2=p1;
cout<<"p2";
p2.print();
}
cout<<"p1:";
p1.print();
}
这样的话在vc6.0环境下会出错。
原因是上面的程序没有用引用作为返回值时,return *this后马上就调用拷贝构造函数。但是由于没有定义就会调用默认的拷贝构造函数。我们知道调用默认的拷贝构造函数时当在类中有指针时就会出错(浅拷贝)。所以如果你不用引用做返回是就必须定义自定义的拷贝构造函数.
3.C++提供的预定义操纵符
1)dec 以十进制形式输入或输出整形数,可用于输入或输出
2)hex 以十六进制形式输入或输出整形数,可用于输入或输出
3)oct 以八进制形式输入或输出整形数,可用于输入或输出
4)ws 用于在输入时跳过开头的空白符,仅用于输入。
5)endl 插入一个换行符并刷新输出流,仅用于输出。
6)ends 插入一个空字符,通常用来结束一个字符串,仅用于输出。
7)flush 刷新一个输出流,仅用于输出。
8)setbase(int n) 把转换基数设置为n(n的取值为0,8,10,或16),n的默认值为0,即以十进制形式输出。
9)resetiosflags(long f) 关闭由参数f指定的格式标志,可用于输入或输出。
10)setiosflags(long f)设置右参数f指定的格式标志,可用于输入或输出。
11)setfill(int c) 设置c为填充字符,默认时为空格,可用于输入或输出。
12)setprecision(int n)设置数据小数部分的位数,可用于输入或输出。
13)setw(int n) 设置域宽为n,可用于输入或输出。
参考:
http://wenku.baidu.com/link?url=33exwQPiY2wJl8M2NCRXY92nGQMlqd-jsvOTDqsYeBoXPphTm2goBSRzgWnNrKasLSbWRA1zG450THJHkOx6m9Hy9n71iyDPl6cv2D681JW###
4.流对象