C++中关键字Struct和Class的区别

2014-06-25  来源:本站原创  分类:C 语言  人气:0 

这篇文章主要介绍了C++中关键字Struct和Class的区别,本文用大量实例讲解了Struct和Class的区别,需要的朋友可以参考下

Struct和Class的区别

今天这篇博文主要讲解在C++中关键字struct和class的区别。这篇博文,将会系统的将这两个关键字的不同面进行详细的讲解。

从语法上来讲,class和struct做类型定义时只有两点区别:

1.默认继承权限,如果不指定,来自class的继承按照private继承处理,来自struct的继承按照public继承处理;

2.成员的默认访问权限。class的成员默认是private权限,struct默认是public权限。以上两点也是struct和class最基本的差别,也是最本质的差别;

但是在C++中,struct进行了扩展,现在它已经不仅仅是一个包含不同数据类型的数据结构了,它包括了更多的功能。

Struct能包含成员函数吗?

是的,答案是肯定的。现在就让我写一段代码验证一下:

/*

** FileName     : StructAndClassDiffDemo

** Author       : Jelly Young

** Date         : 2013/12/7

** Description  : More information, please go to http://www.jb51.net

*/

#include <iostream>

using namespace std;

struct Test

{

    int a;

    int getA()

    {

        return a;

    }

    void setA(int temp)

    {

        a = temp;

    }

};

int main(int argc, char* argv[])

{

    Test testStruct;

    testStruct.setA(10);

    cout<<"Get the value from struct:"<<testStruct.getA()<<endl;

    Test *testStructPointer = new Test;

    testStructPointer->setA(20);

    cout<<"Get the value from struct again:"<<testStructPointer->getA()<<endl;

    delete testStructPointer;

    return 0;

}

以上的代码会很正确的运行,是的;没错,struct能包含成员函数的。

Struct有自己的构造函数吗?

是的,可以的。看以下测试代码:

复制代码 代码如下:

/*

** FileName     : StructAndClassDiffDemo

** Author       : Jelly Young

** Date         : 2013/12/7

** Description  : More information, please go to http://www.jb51.net

*/

#include <iostream>

using namespace std;

struct Test

{

    int a;

    Test()

    {

        a = 100;

    }

    int getA()

    {

        return a;

    }

    void setA(int temp)

    {

        a = temp;

    }

};

int main(int argc, char* argv[])

{

    Test testStruct;

    testStruct.setA(10);

    cout<<"Get the value from struct:"<<testStruct.getA()<<endl;     

        Test *testStructPointer = new Test; 

    testStructPointer->setA(20);

    cout<<"Get the value from struct again:"<<testStruct.getA()<<endl;

    delete testStructPointer;

    // test the constructor

    Test testConstructor;

    cout<<"Set the value by the construct and get it:"<<testConstructor.getA()<<endl;

    return 0;

}

Struct可以有析构函数么?

让我来验证一下:

复制代码 代码如下:

/*

** FileName     : StructAndClassDiffDemo

** Author       : Jelly Young

** Date         : 2013/12/7

** Description  : More information, please go to http://www.jb51.net

*/

#include <iostream>

using namespace std;

struct Test

{

    int a;

    Test()

    {

        a = 100;

    }

    int getA()

    {

        return a;

    }

    void setA(int temp)

    {

        a = temp;

    }

    ~Test()

    {

        cout<<"Destructor function called."<<endl;

    }

};

int main(int argc, char* argv[])

{

    Test testStruct;

    testStruct.setA(10);

    cout<<"Get the value from struct:"<<testStruct.getA()<<endl;     

        Test *testStructPointer = new Test;     

        testStructPointer->setA(20);

    cout<<"Get the value from struct again:"<<testStruct.getA()<<endl;

    delete testStructPointer;

    // test the constructor

    Test testConstructor;

    cout<<"Set the value by the construct and get it:"<<testConstructor.getA()<<endl;

    return 0;

}

是的,完全支持析构函数。

Struct支持继承么?

再让我写代码验证一下:

复制代码 代码如下:

/*

** FileName     : StructAndClassDiffDemo

** Author       : Jelly Young

** Date         : 2013/12/7

** Description  : More information, please go to http://www.jb51.net

*/

#include <iostream>

using namespace std;

struct A

{

    int a;

    A()

    {

        a = 10;

    }

    void print()

    {

        cout<<"I am from A"<<endl;

    }

};

struct B : A

{

    int b;

    B()

    {

        a = 30; // set a to 30

        b = 20;

    }

    /*void print()

    {

    cout<<"I am from B"<<endl;

    }*/

};

int main(int argc, char* argv[])

{

    B b1;

    cout<<b1.a<<endl;

    cout<<b1.b<<endl;

    b1.print();

    A a1;

    cout<<a1.a<<endl;

    a1.print();

    return 0;

}

运行上述代码,struct支持继承。

Struct支持多态么?

写代码测试一下便知:

复制代码 代码如下:

/*

** FileName     : StructAndClassDiffDemo

** Author       : Jelly Young

** Date         : 2013/12/7

** Description  : More information, please go to http://www.jb51.net

*/

#include <iostream>

using namespace std;

struct A

{

    virtual void print() = 0;

};

struct B : A

{

    void print()

    {

        cout<<"I am from B"<<endl;

    }

};

struct C : A

{

    void print()

    {

        cout<<"I am from C"<<endl; 

    } 

}; 

int main(int argc, char* argv[]) 

{     

    A *a1;     

    B *b1 = new B;     

    C *c1 = new C;     

    a1 = b1;     

    a1->print(); // call B, not A

    a1 = c1;

    a1->print(); // call C, not A

    return 0;

}

Struct支持Private、Protected和Public关键字么?

复制代码 代码如下:

/*

** FileName     : StructAndClassDiffDemo

** Author       : Jelly Young

** Date         : 2013/12/7

** Description  : More information, please go to http://www.jb51.net

*/

#include <iostream>

using namespace std;

struct A

{

private:

    int b;

protected:

    int c;

public:

    A()

    {

        b = 10;

        c = 20;

        d = 30;

    }

    int d;

};

struct B : A

{

    void printA_C()

    {

        cout<<A::c<<endl;

    };

    // private member can not see

    /*void printA_B()

    {

    cout<<A::b<<endl;

    }*/

    void printA_D()

    {

        cout<<A::d<<endl;

    }

};

int main(int argc, char* argv[])

{

    A a1;

    B b1;

    // private member can not see

    //cout<<a1.b<<endl;

    // protected member can not see

    //cout<<a1.c<<endl;

    // public member can see

    cout<<a1.d<<endl;

    return 0;

}

写了这么多了,那么会出现这种一个状况,如果是class的父类是struct关键字描述的,那么默认访问属性是什么?

当出现这种情况时,到底默认是public继承还是private继承,取决于子类而不是基类。class可以继承自struct修饰的类;同时,struct也可以继承自class修饰的类,继承属性如下列描述:

复制代码 代码如下:

class B:A{}; // private 继承

class A{};

struct B:A{}; // public 继承

最后,那么到底是使用struct,还是使用class呢?这个看个人喜好,但是这里有一个编程规范的问题,当你觉得你要做的更像是一种数据结构的话,那么用struct,如果你要做的更像是一种对象的话,那么用class。

相关文章
  • C++中关键字Struct和Class的区别 2014-06-25

    这篇文章主要介绍了C++中关键字Struct和Class的区别,本文用大量实例讲解了Struct和Class的区别,需要的朋友可以参考下 Struct和Class的区别 今天这篇博文主要讲解在C++中关键字struct和class的区别.这篇博文,将会系统的将这两个关键字的不同面进行详细的讲解. 从语法上来讲,class和struct做类型定义时只有两点区别: 1.默认继承权限,如果不指定,来自class的继承按照private继承处理,来自struct的继承按照public继承处理: 2.成员

  • 深入C++中struct与class的区别分析 2014-05-25

    本篇文章是对C++中struct与class的区别进行了详细的分析介绍,需要的朋友参考下 一.C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能. struct能包含成员函数吗? 能! struct能继承吗? 能!! struct能实现多态吗? 能!!! 最本质的一个区别就是默认的访问控制,体现在两个方面:1)默认的继承访问权限.struct是public的,class是private的. 写如下的代码: struct A

  • Python中关键字is与==的区别简述 2013-10-19

    这篇文章主要介绍了Python中关键字is与==的区别,对于Python初学者有一定的借鉴学习价值,需要的朋友可以参考下 本文以简单示例分析了python中关键字is与 ==的区别,供大家参考一下. 首先说明一下Python学习中几个相关的小知识点. Python中的对象包含三要素:id.type.value其中:id用来唯一标识一个对象,type标识对象的类型,value是对象的值 is判断的是a对象是否就是b对象,是通过id来判断的 ==判断的是a对象的值是否和b对象的值相等,是通过valu

  • C#中struct和class的区别详解 2014-02-11

    这篇文章主要介绍了C#中struct和class的区别,对C#初学者来说是需要牢固掌握的,需要的朋友可以参考下 本文详细分析了C#中struct和class的区别,对于C#初学者来说是有必要加以了解并掌握的. 简单来说,struct是值类型,创建一个struct类型的实例被分配在栈上.class是引用类型,创建一个class类型实例被分配在托管堆上.但struct和class的区别远不止这么简单. 概括来讲,struct和class的不同体现在: ● 类是引用类型,struct是值类型 ● 在托

  • Laravel模板引擎Blade中section的一些标签的区别介绍 2013-11-29

    这篇文章主要介绍了Laravel模板引擎Blade中section的一些标签的区别介绍,本文讲解了@yield 与 @[email protected] 与 @[email protected] 和 @override的区别,需要的朋友可以参考下 Laravel 框架中的 Blade 模板引擎,很好用,但是在官方文档中有关 Blade 的介绍并不详细,有些东西没有写出来,而有些则是没有说清楚.比如,使用中可能会遇到这样的问题: [email protected] 和 @section 都可以预定义可替代的区块,这两者有什么区别呢?

  • Go语言中普通函数与方法的区别分析 2014-01-05

    这篇文章主要介绍了Go语言中普通函数与方法的区别,以实例形式对比分析了普通函数与方法使用时的区别与相关技巧,需要的朋友可以参考下 本文实例分析了Go语言中普通函数与方法的区别.分享给大家供大家参考.具体分析如下: 1.对于普通函数,接收者为值类型时,不能将指针类型的数据直接传递,反之亦然. 2.对于方法(如struct的方法),接收者为值类型时,可以直接用指针类型的变量调用方法,反过来同样也可以. 以下为简单示例: package structTest //普通函数与方法的区别(在接收者分别为值

  • C语言中常量指针与指针常量区别浅析 2014-03-04

    这篇文章主要介绍了C语言中常量指针与指针常量区别,有需要的朋友可以参考一下 常量指针是指--指向常量的指针,顾名思义,就是指针指向的是常量,即,它不能指向变量,它指向的内容不能被改变,不能通过指针来修改它指向的内容,但是指针自身不是常量,它自身的值可以改变,从而指向另一个常量. 指针常量是指--指针本身是常量.它指向的地址是不可改变的,但地址里的内容可以通过指针改变.它指向的地址将伴其一生,直到生命周期结束.有一点需要注意的是,指针常量在定义时必须同时赋初值. 注:也有人将这两个名称的定义与含义

  • .net中as和is之间的区别分析 2015-01-14

    .net中as和is之间的区别分析,需要的朋友可以参考一下 1.as 用于在兼容的引用类型之间执行转换,as 运算符类似于强制转换操作:但是,如果转换不可行,as 会返回 null 而不是引发异常.更严格地说,这种形式的表达式:expression as type,等效于expression is type ? (type)expression : (type)null,只是 expression 只被计算一次.注意,as 运算符只执行引用转换和装箱转换.as 运算符无法执行其他转换,如用户定义

  • JQuery中$.each 和$(selector).each()的区别详解 2015-02-08

    这篇文章主要介绍了JQuery中$.each 和$(selector).each()的区别详解,本文给出了多个例子讲解了它们之间的不同之处,需要的朋友可以参考下 一个通用的遍历函数 , 可以用来遍历对象和数组. 数组和含有一个length属性的伪数组对象 (伪数组对象如function的arguments对象)以数字索引进行遍历,从0到length-1, 其它的对象通过的属性进行遍历. $.each()与$(selector).each()不同, 后者专用于jquery对象的遍历, 前者可用于遍

  • Java关键字new和newInstance的区别方法 2013-09-06

    在初始化一个类,生成一个实例的时候,newInstance()方法和new关键字除了 一个是方法,一个是关键字外,最主要有什么区别?它们的区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类.那么为什么会有两种创 建对象方式?这主要考虑到软件的可伸缩.可扩展和可重用等软件设计思想. Java中工厂模式经常使用newInstance()方法来创建对象,因此从为什么要使用工厂模式上可以找到具体答案. 例如: class c = Class.forName("Example"

  • php中is_null,empty,isset,unset 的区别详细介绍 2013-10-09

    本篇文章介绍了,php中is_null,empty,isset,unset 的区别详细分析.需要的朋友参考下 is_null, empty, isset, unset 我们先来看看这4个函数的描述. isset 判断变量是否已存在(配置) unset 把变量删除(释放)掉 empty 判断变量是否为空 is_null 判断变量是否为NULL ok,已经开始搞人了.那么开始,这4个函数中除了unset,其他3个都是判断函数,unset首先出局,因为他不会搞错,其次是is_null,我们可以把它看成

  • JS中confirm,alert,prompt函数使用区别分析 2013-10-23

    JS中confirm,alert,prompt函数使用区别分析,需要的朋友可以参考下. window.alert:参数,只有一个,显示警告框的信息; 无返回值. <script> window.alert("确定.") </script> window.confirm : 参数就只有一个.显示提示框的信息. 按确定,返回true; 按取消返回false. <script> var bln = window.confirm("确定吗?&quo

  • js对列表中第一个值处理与jsp页面对列表中第一个值处理的区别详解 2013-10-27

    本文是对js对列表中第一个值处理与jsp页面对列表中第一个值处理的区别进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助 js:$("<li>"+(i==0?"class='cur'":"")+"</li>").appendTo("ul"); jsp: <c:forEach items="${list}" var="listValue&

  • php中time()与$_SERVER[REQUEST_TIME]用法区别 2013-12-09

    这篇文章主要介绍了php中time()与$_SERVER[REQUEST_TIME]用法区别,详细分析了time()与$_SERVER[REQUEST_TIME]的用法,并以实例形式对比总结了二者在获取当前系统时间戳与请求时间戳的区别,需要的朋友可以参考下 本文实例详细讲述了php中time()与$_SERVER[REQUEST_TIME]用法的区别.分享给大家供大家参考.具体分析如下: 简单的说time()与$_SERVER["REQUEST_TIME"]都是获得时间的,但time返

  • php中switch与ifelse的效率区别及适用情况分析 2013-12-16

    这篇文章主要介绍了php中switch与ifelse的效率区别及适用情况分析,以实例的形式分析了针对变量与常量的情况下switch与ifelse的效率区别,非常具有实用价值,需要的朋友可以参考下 本文实例分析了php中switch与ifelse的效率区别及适用情况.分享给大家供大家参考.具体分析如下: PHP中的这两个方法都是用于判断值是否满足条件,如果满足/不满足做出不同行为动作. 不管写什么语言的程序,一定会考虑到代码的运行效率问题.在查阅了一些资料后,switch与ifelse在不同的'环

  • 深入理解jQuery中live与bind方法的区别 2014-01-17

    本篇文章主要是对jQuery中live与bind方法的区别进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助 注意如果是通过jq添加的层和对象一定要用live(),用其他的都不起作用 live的缺点就是,运行完以后不释放空间,太多的使用会占用更多的内存,bind()则点击完以后释放空间 区别一: Click here 可以给这个元素绑定一个简单的click事件: $('.clickme').bind('click', function() { $('body').append('

  • 探讨C语言中关键字volatile的含义 2014-01-20

    本篇文章是对C语言中关键字volatile的含义进行了详细的分析介绍,需要的朋友参考下 volatile 的意思是"易失的,易改变的".这个限定词的含义是向编译器指明变量的内容可能会由于其他程序的修改而变化.通常在程序中申明了一个变量时,编译器会尽量把它存放在通用寄存器中,例如ebx.当CPU把其值放到ebx中后就不会再关心对应内存中的值.若此时其他程序(例如内核程序或一个中断)修改了内存中它的值,ebx中的值并不会随之更新.为了解决这种情况就创建了volatile限定词,让代码在引用

  • PHP中array_merge和array相加的区别分析 2014-02-01

    今天处理一个这样的问题:如何获取字符键名相同值不同的两个数组值集合,用array_merge和数组相加都不可行,让我认真比较了下PHP中array_merge和array相加的区别 首先来看看键名是string,两者区别: <?php $arr1 = array('a'=>'PHP'); $arr2 = array('a'=>'JAVA'); //如果键名为字符,且键名相同,array_merge()后面数组元素值会覆盖前面数组元素值 print_r(array_merge($arr1,

  • JQuery+JS实现仿百度搜索结果中关键字变色效果 2014-03-01

    JQuery+JS实现仿百度搜索结果中关键字变色效果代码,需要的朋友可以参考下. 1.源码 <script type="text/javascript"> $(function() { $("#btn_1").click(function() { var $keyword = $("#Text1").val() setHeightKeyWord('bbb', $keyword, 'Red', true) }); }); functio

  • C#中值类型和引用类型的区别深度分析 2014-03-13

    这篇文章主要介绍了C#中值类型和引用类型的区别深度分析,以通俗易懂的语言形象化的分析了C#中值类型和引用类型的区别,对于深入理解C#数据类型有着不错的参考借鉴价值,需要的朋友可以参考下 本文通俗易懂的分析了C#中值类型和引用类型的区别.分享给大家供大家参考.具体分析如下: 似乎"值类型和引用类型的区别"是今年面试的流行趋势,我已然是连续三次(目前总共也就三次)面试第一个问题就遇到这个了,这是多大的概率啊,100%,哈哈,我该买彩票去! 言归正传,咱还是先来探讨探讨这二者之间有什么区别吧