| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1538 人关注过本帖
标题:关于"&"符号
只看楼主 加入收藏
xupeng
Rank: 1
等 级:新手上路
帖 子:4049
专家分:0
注 册:2006-2-12
收藏
 问题点数:0 回复次数:24 
关于"&"符号

CToolBarCtrl&ToolBarCtrl = GetToolBarCtrl();CToolBarCtrl是一个类,ToolBarCtrl是对象

,GetToolBarCtrl()返回的是CToolBarCtrl的对象。为什么我不加&就会报错:没有可用的复制构造函数或

复制构造函数声明为“explicit”。我查MSDN了,MSDN上说:复制构造函数从同一类型的另一个对象初始

化某对象。(它生成源对象的副本。)如果没有定义任何构造函数,则编译器生成默认复制构造函数。“

&”究竟起到什么作用,请大侠们给小弟指点指点!!!!!

搜索更多相关主题的帖子: 符号 函数 构造 CToolBarCtrl 对象 
2006-02-22 13:18
柳儿
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:1830
专家分:30
注 册:2004-9-23
收藏
得分:0 
因为你没有定义CToolBarCtrl这个类的复制构造函数,或者重载操作符‘=’

成功会使人骄傲。如果你骄傲自大,你就会停止学习。不学习,人就停止了进步
2006-02-22 13:27
xupeng
Rank: 1
等 级:新手上路
帖 子:4049
专家分:0
注 册:2006-2-12
收藏
得分:0 
能不能详细点!!
关键是"&"是干什么用的!!
谢谢大侠!!!

反清复明 http://xupeng.
2006-02-22 13:51
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
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 中所隐掉的代码消除注释行记号,你再看看会怎么样? 再想想为什么???

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2006-02-22 15:35
xupeng
Rank: 1
等 级:新手上路
帖 子:4049
专家分:0
注 册:2006-2-12
收藏
得分:0 
我用的是编译器.

反清复明 http://xupeng.
2006-02-22 17:05
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
如果可以的话,请贴上完整代码, 或发到我的信箱: kaihua1@yahoo.com
我估计明天会给你回复, 待会儿我要出去了.

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2006-02-22 17:07
xupeng
Rank: 1
等 级:新手上路
帖 子:4049
专家分:0
注 册:2006-2-12
收藏
得分:0 
4楼的帖子实在是经典,可我是菜鸟,没搞明白,抱歉。我关心的是"&amp;"的作用。

反清复明 http://xupeng.
2006-02-22 17:07
dang800919
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2005-12-5
收藏
得分:0 
1.&amp;符号的最白的意思 就是 取地址符...
2006-02-22 23:32
xupeng
Rank: 1
等 级:新手上路
帖 子:4049
专家分:0
注 册:2006-2-12
收藏
得分:0 
不错
但是在这里绝对不是取地址呦!我觉得跟复制构造函数有关!!

反清复明 http://xupeng.
2006-02-23 08:14
olivezhang
Rank: 1
等 级:新手上路
帖 子:223
专家分:0
注 册:2005-9-14
收藏
得分:0 
建义楼主看看C++的引用,自然就明白了,kai写的是数据类型转换,这部分内容平时很少机会用到,至少我目前还没有在项目中用过。。。:)

谷底深深行 ,峰顶漫漫步......@_@
2006-02-23 12:06
快速回复:关于"&"符号
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019641 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved