您的位置:首页 > 编程语言 > C语言/C++

Struct还是Class?

2014-03-03 17:36 543 查看
看到这么个标题,首先我们可以不用去想C或者Java。他们俩都没有这个麻烦。

当C开始过渡走向C++的时候,class出现了,struct当然也还在,不过strut已然不是当年的它了。记得去年读C++编程思想的时候,发现所有的类都是struct很是吃惊,看官尽可笑话在下没见过世面,不过一个疑问瞬间诞生了:区别呢?

##C++的区别很简单,我们就不要追究了,二者的区别仅在于struct默认成员都是共有的,而class则默认是私有的。(Java默认居然是default,前几天看到程序员面试宝典上面居然说默认是protected,不过还是有些差异,尽管你完全不必理会它。)

##下面就来测试一下C#。

struct TypeStruct
{
string name;
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
class TypeClass
{
string name;
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
        private void btn_Click(object sender, RoutedEventArgs e)
        {
            TypeClass clz = new TypeClass();
            TypeStruct stc = new TypeStruct();

            clz.Name = "type class";
            stc.Name = "type struct";

            Console.WriteLine("class before changed:" + clz.Name);
            Console.WriteLine("struct before changed:" + stc.Name);

            changeClass(clz);
            changeStruct(stc);

            Console.WriteLine("class after changed:" + clz.Name);
            Console.WriteLine("struct after changed:" + stc.Name);
        }

        private void changeStruct(TypeStruct ts)
        {
            ts.Name = "type struct changed";
            Console.WriteLine(ts.Name);
        }

        private void changeClass(TypeClass tc)
        {
            tc.Name = "type class changed";
            Console.WriteLine(tc.Name);
        }


因为我的工程是wpf工程,所以用了一个按钮触发。我本来以为就像C++说的那样,struct里面的成员默认是公有的,哦,我错了,我试图写出stc.name这样的代码去访问name属性,不可以。
那么看看输出结果:

class before changed:type class

struct before changed:type struct

type class changed

type struct changed

class after changed:type class changed

struct after changed:type struct

好的,如果是class的实例,我们发现在函数当中修改对象的值,会影响外部的对象。也就是说class的对象是引用性,函数传入的是对象的引用,而不是对象的副本。

struct却就像int这样的内建类型一样只传了一个对象的副本进去,正是值传递的意思。实际上,如果从语法表面上讲,C#的struct就是C++的struct的内部版本,因为除了内部的成员默认是外部不可访问的,其他用法似乎很像。(试想一下,C++里面的struct也好,class也好,如果不传指针或者引用的话,会不会是直接传入对象的值拷贝?)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c# c c++ 程序员 编程