免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: lipingtababa
打印 上一主题 下一主题

[C++] 你们的代码会用引用吗? [复制链接]

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
141 [报告]
发表于 2008-11-28 14:24 |只看该作者
原帖由 newcuusre 于 2008-11-27 15:39 发表
描述一个事物过程:选择一种语言,在这种语言里寻找恰当的词,用选好的词语构造句子。
如果在第一步你选择是一种散漫不够严谨的语言,它允许你随意造词,后果会是什么?别人不明白或误解你的描述。
C++就是这 ...


见过了 JavaScript  你就会觉得 C++ 太严谨了。

C++ 是前辈们为向我这样的懒惰程序员能少写几个字而设计的语言,而最近发展起来的 C# , C++/CLI 就更“懒惰”了,其实你可以用 C 实现面向对象等 C++ 的功能,只是通常要多写几行代码。

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
142 [报告]
发表于 2008-11-28 14:29 |只看该作者
原帖由 flw 于 2008-11-19 10:53 发表
楼主要是觉得引用不好,大可以像赵平智一样,把自己的想法付诸于实现,做出一个像样的东西来让大家明白你的想法。
天马行空地想象设计确实很值得赞赏,
可是计算机不完全是理论,还是一个工程,有些看上去很美 ...



有迹象表明,赵平智回来了。

论坛徽章:
0
143 [报告]
发表于 2008-11-28 15:02 |只看该作者
原帖由 sbc19861004 于 2008-11-27 09:37 发表


你这是从c语言的值传递的观点衍生出来的。
引用也可以很好的满足数据隔离。
可能修改的数据使用值传递,即:void func(int &
不修改的数据使用const严格声明,即:void funct(const int &
也可以达到 ...


你没明白我说的呀!

/* 甲设计了fun函数 */
void fun(int &n)
{
        n++;
        printf("in fun. n=%d\n",n);
}

int main()
{
        int n=88;
        fun(n);  /* 你使用fun函数 */
        printf("n=%d\n",n);
        return 0;
}

你调用了甲定义的fun函数,过些日子后,你再看到“fun(n);”时,你肯定会想n是传数值还是传引用?然后你就P颠P颠跑来跑去地找fun函数的定义,看到底是传引用还是传数值。如果你在程序里使用了许多引用,你就累P了。但是如果fun的参数是指针类型呢,那么无论何时你看到“fun(&n);”都会一眼明白是传指针,你这不就省心多了,就不用P颠P颠跑来跑去了。

论坛徽章:
0
144 [报告]
发表于 2008-11-28 16:06 |只看该作者
从计算机体系结构层面讲,
可以传递的只有"值"和"地址".

引用是编译层面做的一个给编程序人的一个"假象".
实际上可以做的这样的"假象"是很多的.
比如:
func(i),
编译可以将i放到一个什么(比如A)里面, 然后传递A的地址, 地址的地址.....
等.

而对于程序作者或读者来说, "假象"越多, 越难看明白, 越难以回忆.

原帖由 cbvxvx 于 2008-11-28 15:02 发表


你没明白我说的呀!

/* 甲设计了fun函数 */
void fun(int &n)
{
        n++;
        printf("in fun. n=%d\n",n);
}

int main()
{
        int n=88;
        fun(n);  /* 你使用fun函数 * ...

论坛徽章:
0
145 [报告]
发表于 2008-11-28 16:21 |只看该作者
原帖由 思一克 于 2008-11-28 16:06 发表
从计算机体系结构层面讲,
可以传递的只有"值"和"地址".

引用是编译层面做的一个给编程序人的一个"假象".
实际上可以做的这样的"假象"是很多的.
比如:
func(i),
编译可以将i放到一个什么(比如A)里面, 然 ...


嗯,思版主说的是也,所以强烈建议用指针不要使用引用!

[ 本帖最后由 cbvxvx 于 2008-11-28 16:45 编辑 ]

论坛徽章:
0
146 [报告]
发表于 2008-11-28 17:12 |只看该作者
但是, C++程序有时候必须用. 不用就无法达到目的或十分困难. 比如运算符号RELOAD.

引用估计是C++设计后来必须引入的.

原帖由 cbvxvx 于 2008-11-28 16:21 发表


嗯,思版主说的是也,所以强烈建议用指针不要使用引用!

论坛徽章:
0
147 [报告]
发表于 2008-11-28 19:50 |只看该作者
原帖由 cbvxvx 于 2008-11-28 15:02 发表


你没明白我说的呀!

/* 甲设计了fun函数 */
void fun(int &n)
{
        n++;
        printf("in fun. n=%d\n",n);
}

int main()
{
        int n=88;
        fun(n);  /* 你使用fun函数 * ...


我说了,你这是基于修改数据接口并不显式告知的原则, 为了保证隔离,传值的是肯定不可能改的,传地址的就是可能改的。
但是如果类型很大,比如你定义了一些结构体,你肯定不能传值,因为空间开销太大,你的接口就都用指针,修不修改就不知道了,为了搞明白这件事,岂不是还要屁颠屁颠的跑来跑去?(我喜欢这个说法,可以讨论的更轻松些
使用的函数是否修改传入的参数,应该由接口明确告知,这样就解决了屁颠问题了。
其实指针的使用也是这种原则,如c的字符串库,传出的参数是否修改都是有const规定好的,如:char *strcpy(char *dest, const char *src);

论坛徽章:
0
148 [报告]
发表于 2008-11-28 20:18 |只看该作者
原帖由 思一克 于 2008-11-28 16:06 发表
从计算机体系结构层面讲,
可以传递的只有"值"和"地址".

引用是编译层面做的一个给编程序人的一个"假象".
实际上可以做的这样的"假象"是很多的.
比如:
func(i),
编译可以将i放到一个什么(比如A)里面, 然 ...


“假象”这种说法确实是引用和指针的关系,但引用的这种“假象”又怎么会迷惑编程者呢?他是给编程者一个更为抽象的视图,还是我前面说过的“让类型成为程序中的原子”;
指针是赤裸裸的,它让你可以剥开一个类型的外衣看看它的内部,可它又不知道这个类型的内部组织结构,它认为他们都是顺序的字节块,于是随便的拿几个出去用(肯定可以这么做,因为指针可以任意的转换,那它指向的块的大小就可以变了,随意找些位置拿来用用,都是合理的)。

至于引用在编译后变成什么样,那是用户透明的,良好的实现应该是编译器去关心。
还是忍不住举个例子:
class a {
private:
int a;
int b;
public:
a(void);
char getAChar(void *b);
};

a *testa = new a();
char *b = (char *)testa;
.
.
.      (若干代码之后)
.
printf("%s", b++);                 这会是什么,只有老天爷知道,可是指针让这么做;引用,没这个问题

论坛徽章:
0
149 [报告]
发表于 2008-11-28 20:18 |只看该作者

回复 #147 sbc19861004 的帖子

fun( const * const 结构体指针);
这样fun函数对结构体指针和结构体所指内容都不能改动了.

BTW: 如果这你都不知道, C语言你学得不乍地呀.

论坛徽章:
0
150 [报告]
发表于 2008-11-28 20:30 |只看该作者

回复 #149 cbvxvx 的帖子

对啊,你说的情况我说啦。
这种方式不就也和引用是否修改值的接口方式一样了吗?
fun(const &结构体变量)

明确声明是否更改传入参数,这才是好的接口

另:“BTW: 如果这你都不知道, C语言你学得不乍地呀.”,怎么又人身攻击?这样讨论问题不好吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP