关于class与struct的联系学习与总结

来源:互联网 发布:苹果手机视频软件 编辑:程序博客网 时间:2024/06/06 04:43

【本文转自http://www.diybl.com/course/3_program/c++/cppsl/2008222/100455.html

讨论一下结构(struct)与类(class)的区别,你认为结构(struct)有些什么作用,可以完全用类(class)取代么??
---------------------------------------------------------------

首先,讨论这个问题应该仅从语法上讨论,如果讨论不同人之间编程风格上的差异,那这个问题是没有答案的。毕竟不同的人偏好不同。

从语法上,在C++中(只讨论C++中)。classstruct做类型定义时只有两点区别:
(一)默认继承权限。如果不明确指定,来自class的继承按照private继承处理,来自struct的继承按照public继承处理;
(二)成员的默认访问权限。class的成员默认是private权限,struct默认是public权限。
除了这两点,classstruct基本就是一个东西。语法上没有任何其它区别。

不能因为学过C就总觉得连C++structclass都区别很大,下面列举的说明可能比较无聊,因为structclass本来就是基本一样的东西,无需多说。但这些说明可能有助于澄清一些常见的关于structclass的错误认识:
1)都可以有成员函数;包括各类构造函数,析构函数,重载的运算符,友元类,友元结构,友元函数,虚函数,纯虚函数,静态函数;
2)都可以有一大堆public/private/protected修饰符在里边;
3)虽然这种风格不再被提倡,但语法上二者都可以使用大括号的方式初始化:A a = {1, 2, 3};不管A是个struct还是个class,前提是这个类/结构足够简单,比如所有的成员都是public的,所有的成员都是简单类型,没有显式声明的构造函数。
4)都可以进行复杂的继承甚至多重继承,一个struct可以继承自一个class,反之亦可;一个struct可以同时继承5class5struct,虽然这样做不太好。
5)如果说class的设计需要注意OO的原则和风格,那么没任何理由说设计struct就不需要注意。
6)再次说明,以上所有说法都是指在C++语言中,至于在C里的情况,C里是根本没有“class”,而Cstruct从根本上也只是个包装数据的语法机制。
---------------------------------------------------------------

最后,作为语言的两个关键字,除去定义类型时有上述区别之外,另外还有一点点:“class”这个关键字还用于定义模板参数,就像“typename”。但关键字“struct”不用于定义模板参数。

来源:csdn.net

(个人认为最后一段是毫无意义的,因为C++中用来定义模板参数的“class”关键字并非代表olivue_antil

----------------------------------------------

如果没有多态和虚拟继承,在C++中,struct和class的存取效率完全相同!简单的说就是,存取class的data member和非virtualfunction效率和struct完全相同!不管该datamember是定义在基类还是派生类的。

如果不是为了和C兼容,C++中就不会有struct关键字。因此建议是:如果不需要与C兼容或传递参数给C程序,不要在C++中用struct。

注意class的data member在内存中的布局可不一定是data member的申明次序。C++只保证处于同一个access section的data member按照申明次序排列。

-- 《Inside The C++ Object Model

 

【以下部分转自:http://hi.baidu.com/tekuba/item/82eacbf8b761cfc50cd1c85c

这里有两种情况下的区别。
1CstructC++class的区别。
2C++中的structclass的区别。
     
在第一种情况下,structclass有着非常明显的区别。C是一种过程化的语言,struct只是作为一种复杂数据类型定义,struct中只能定义成员变量,不能定义成员函数(在纯粹的C语言中,struct不能定义成员函数,只能定义变量)。例如下面的C代码片断:
        struct Point
        {
                int x; //
合法
                int y; //
合法
                void print()
                {
                       printf("Point print\n"); //
编译错误
                };
}9        ;

        这里第7行会出现编译错误,提示如下的错误消息:函数不能作为Point结构体的成员。因此大家看到在第一种情况下struct只是一种数据类型,不能使用面向对象编程。

现在来看第二种情况。首先请看下面的代码:

       #include <iostream>
        using namespace std;
        class CPoint
        {
                int x;                 //
默认为private
                int y;                 //
默认为private
                voidprint()             //
默认为private
                {
                       cout << "CPoint: (" << x<< ", " << y << ")" << endl;
                }
        public:
                CPoint(int x,int y)      //
构造函数,指定为public
                {
                       this->x = x;
                       this->y = y;
                }
                void print1()//public
                {
                       cout << "CPoint: (" << x<< ", " << y << ")" << endl;
                }
        };
        
        struct SPoint
        {
                int x;             //
默认为public
                int y;             //
默认为public
                voidprint()         //
默认为public
                {
                       cout << "SPoint: (" << x<< ", " << y << ")" << endl;
                }
                SPoint(int x,int y)  //
构造函数,默认为public
                {
                       this->x = x;
                       this->y = y;
                }
        private:
                voidprint1()      //private
类型的成员函数
                {
                       cout << "SPoint: (" << x<< ", " << y << ")" << endl;
                }
        };
        
        int main(void)
        {
                CPoint cpt(1,2);  //
调用CPoint带参数的构造函数
                SPoint spt(3,4);  //
调用SPoint带参数的构造函数
                
                cout <<cpt.x << " " << cpt.y << endl;  //
编译错误
               cpt.print();       //
编译错误
                cpt.print1();     //
合法
        
               spt.print();      //
合法
               spt.print1();     //
编译错误
                cout <<spt.x << " " << spt.y << endl;  //
合法
        
                return 0;
        }
     
在上面的程序里,struct还有构造函数和成员函数,其实它还拥有class的其他特性,例如继承、虚函数等。因此C++中的struct扩充了Cstruct功能。那它们有什么不同呢?
       main
函数内的编译错误全部是因为访问private成员而产生的。因此我们可以看到class中默认的成员访问权限是private的,而struct中则是public的。在类的继承方式上,structclass又有什么区别?请看下面的程序:
        #include <iostream>
        using namespace std;
        class CBase
        {
        public:
                voidprint()               //public
成员函数
                {
                       cout << "CBase: print()..."<< endl;
                }
        };
        class CDerived1 : CBase       //
默认private继承
        {
        };
        
        class CDerived2 : public Cbase  //
指定public继承
        {
        };
        
        struct SDerived1 : Cbase       //
默认public继承
        {
        };
        
        struct SDerived2 : privateCbase  //
指定public继承
        {
        };
        
        int main()
        {
                CDerived1cd1;
                CDerived2cd2;
                SDerived1sd1;
                SDerived2sd2;
        
               cd1.print();    //
编译错误
                cd2.print();
                sd1.print();
               sd2.print();    //
编译错误
        
                return 0;
        }
       
可以看到,以private方式继承父类的子类对象不能访问父类的public成员。class继承默认是private继承,而struct继承默认是public继承。另外,在C++模板中,类型参数前面可以使用classtypename,如果使用struct,则含义不同,struct后面跟的是“non-typetemplate parameter”,而classtypename后面跟的是类型参数。
事实上,C++中保留struct的关键字是为了使C++编译器能够兼容C开发的程序。
答案:
分以下所示两种情况。
C
structC++class的区别:struct只是作为一种复杂数据类型定义,不能用于面向对象编程。
C++
中的structclass的区别:对于成员访问权限以及继承方式,class中默认的是private的,而struct中则是public的。class还可以用于表示模板类型,struct则不行。

【以下部分转自http://blog.csdn.net/nocky/article/details/6195556

很多初学者或者是想当然,或者是被网上的一些错误信息给误导,面试中问到classstruct区别时经常会说class可以继承而struct不可以继承,这是完全错误的。但在C#中,classstruct确实有这点区别(当然不止这一点)。其实,在C++中,这两个关键词并没有大的区别,仅在细节上有些不同。

1字面上的区别

在字面上structstructure的缩写,通常叫做结构体,在C语言里用于将多种数据、多个变量组织在一起,便于表达比较复杂的数据类型,在C++中为了兼容C语言保留了该关键字,并且保留了C语言中的所有功能。

class,则称作,是C++新增来支持面向对象思想概念中的概念的一个关键词,并且比struct具有了更强大的功能,不仅可以像C语言中的struct一样把数据组织在一起,还可以将与数据相关的方法组织在一起,并增加了如虚函数、继承等特性来支持面向对象编程。

虽然在字面上structclass的含义不一样,但在C++中其功能基本是相同的,C++中的struct不仅可以包含数据成员,而且与class一样支持新增的面向对象特性,仅在以下细节上有略微差别。

既然两者在字面上不一样,为了更好地利用这一点,建议在C++中使用struct时仍然只使用C中的特性,来表示一些复杂的数据而不进行方法的封装,这样还可以提高软件的可读性。

2. 默认成员权限区别

struct的成员默认权限是public,而class的成员默认权限是private。例如:

struct Sb{ void f( void ) { } };

struct Sc : Sb{ };

class Cb{ void f( void ) { } };

class Cc1 : public Sb{ };

class Cc2 : Sb{ };

sb.f(); // 合法

cb.f(); // 不合法,因为在Cb类中f( )函数默认为private,此处不可访问

建议在工程代码中显示声明成员的权限,而有使用默认权限,因为并不是所有人都知道这一点。

3. 默认继承方式

struct的默认继承方式为public,而class的默认继承为private,例如:

Sc sc; Cc1 cc1; Cc2 cc2;

sc.f(); // 合法

cc1.f(); // 合法,因为Cc1显示地使用public继承

cc2.f(); // 不合法,Cc2默认private继承自Sb,在Cc2f( )private

C语言中struct不可以继承,虽然我们知道在C++struct可以继承,但在实际使用中,在不需要继承的场合我们使用struct,而在需要继承的场合使用class,这样更贴近其字面意思,使程序有更好的可读性。

虽然知道class的默认继承为private,但并不是项目组的每个人都清楚这一点,建议在工程代码中不省略private,使代码可读性更强。

4. 用于定义模板参数

模板为C++语言新增特性,C语言没有,只有class可用于定义参数,而struct不可以,例如:

template

class TValue {

private: T _v;

public: TValue(T v) : _v(v){}

T Get( void ) { return _v; }

};

此处只能使用class,不能使用struct。当然,此处还可以使用typename代替classclasstypename也仅在定义模板参数时可以互换,而且建议此时使用typename,因为这样读起来更接近人类语言,更具有可读性。

在C中用struct模拟C++中class类的一种做法讨论

#include <stdio.h>

#include<malloc.h>

//本程序用于研究用C中的struct结构模拟C++中的类,以函数指针的方式为struct添加对成员函数的支持

//定义一个“类”

typedef struct _myclass 

       int a;

       int b;

       int (*max)(int c,int d);

       int (*min)(int c,int d);

       int (*addab)(struct _myclass *t);

}myclass; 

 

//类成员函数1,2的操作数与类成员变量无关,那么函数的定义方法和C++中一样

int mbmax(inta,int b){

    return (a>b?a:b);

    }

   

int mbmin(inta,int b){

    return (b<a?b:a);

    }

   

//类成员函数的操作数与类成员变量有关,那么该函数需要当前类实例的地址做为输入,有没有高手可以不用当前类实例的地址就可以解决这个问题?

//进一步需要指出的是,如果一个成员函数通过调用其它成员函数间接操作了类成员变量,那么这个函数也需要传入当前的类实例地址

//唉,有没有办法自动获得这个this指针呢。。。。。。。

intmbaddab(myclass *t){

    return t->a+t->b;

    }

 

//相当于C++的类构造函数,用于创建一个类实例,并初始化这个类实例,构造函数命名采用 类名init 的方式。

myclass *myclassinit(){

     myclass *t=(myclass  *)malloc(sizeof(myclass));

     t->a=1;

     t->b=1;

     t->max=mbmax;

     t->min=mbmin;

     t->addab=mbaddab;

     return t;

    }

 

   

int main(){

    myclass *tt=myclassinit();  //类的创建方法只要一条语句就可以完成,达到了和C++中new类似的效果

   

    printf("the max number is%d\n",tt->max(4,8));

    printf("the min number is%d\n",tt->min(4,8));

    printf("a plus b is %d\n",tt->addab(tt));

    return 0;

}

 

欢迎大家留言一起讨论。

 


原创粉丝点击