xupeng,
请问你用的是什么编译器?
C++ 自动提供以下成员函数:
1) a default constructor if you define no constructors;
2) a copy constructor if you don't define one
3) an assignment operator if you don't define one
4) a default destructor if you don't define one
5) an address operator if you don't define one
当然这以上5点, 都是理论上的, 也就是从C++ 语言的角度出发是这样定义的, 但是我们知道我们的代码要经过编译器的编译连接才生成最终的执行代码, 而编译是否通过,一方面当然是看你的代码, 另外一方面, 如果你的编译器给你一个出错信息, 并不意味着你的代码出了问题, 恰恰相反, 你的编译器出了问题. 要知道, 编译器也是一个软件, 如果写软件的人对C++ 标准本身不了解或曲解其意,那么当然最后的结果是编译出问题, 有些问题是可以原谅的, 比如VC 对标准的非完全支持, 如果你在C++ 里要用到template, 以及和 template 相关的技术, 那么我建议你不要用VC, 而是用完全支持C++ 标准的gcc 编译器, DEV 就是采用GCC 编译器的一款 IDE. 所以你可以使用DEV.
题外话, 上面所说的5点, 虽然C++ 是这样定义, 即便编译器也是这样做的话. 你写代码的时候必须十分小心, 如果你的 class 中有 用动态开辟空间的指针变量, 那么你必须自己重写 1)copy constructor, 2)assignment operator function 3) 那个 destructor 是当然不能少的. 这样做的目的是为了实现 deep copy. 也就是说, 让内容确实存在于一个新的空间中, 而不是指针指向一个共同的空间.
你所问的 & 的问题, 是一个引用的问题. 我们看下面一段代码:
ostream & operator<<(ostream & os, const c_name & obj) // 注意那个返回的类型
{
os<<...; // display object contents
return os;
}
现在的问题, 如果代码是这样的会怎么样呢?
ostream operator<<(ostream & os, const c_name & obj) // 注意那个返回的类型
{
os<<...; // display object contents
return os;
}
第一段代码和第二段代码的区别在于那个返回类型, 那么这个区别说明什么呢? 首先要说的是这两个函数没有问题, 但是他们的效果是不一样的.
第一个函数允许你对ostream object 连续调用如 cout<<"word1"<<"word2"<<"and so on";
而第二个就不可以了, 如果你的ostream object 为 myCout; 那么它只能调用一次, 如 myCout<<"word1"; 但是 myCout<<"word1"<<"word2"; 就不行. 要实现, 就必须写两行代码如: myCout<<"word1"; myCout<<"word2";
还有一点想说, 你知道Constructor 的作用吗? 当然是建立一个Object, 还有呢? 还有一点就是数据类型的转换匹配.
比如:
#include <iostream>
class Test
{
private:
int a;
public:
Test(){a = 0;}
// Test(int value){a = value;}
// operator int() const
// {
// return a;
// }
void display(){ std::cout<<a<<std::endl;}
};
int main()
{
int a = 3;
Test test(6);
test.display();
test = a; // pay attention here,
test.display();
a = test; // is this possible?
std::cout<<a<<std::endl;
return 0;
}
看看那个test = a; 看看那个 a = test;
编译那个程序, 你会得到出错信息, 如果你将那个class 中所隐掉的代码消除注释行记号,你再看看会怎么样? 再想想为什么???