C++中struct与class的区别(转载)

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

1。 字面上的区别

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

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

虽然在字面上struct与class的含义不一样,但在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,在Cc2中f( )为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代替class,class与typename也仅在定义模板参数时可以互换,而且建议此时使用typename,因为这样读起来更接近人类语言,更具有可读性。

总的来讲,C++中struct和class是基本上完全相同的。

C++中struct与class的区别(转载)

时间: 2024-10-18 15:32:29

C++中struct与class的区别(转载)的相关文章

.NET中struct与class的区别

在.net中的struct与class有很多相似之处,比如可以直接new,对于成员可以直接XX.field,以至于有不少程序员在用时,将其混在一起,分不清有何区别.这两者有何区别呢? 1.类型不同 我们先来看一段代码 static void Main(string[] args) { TypeDemo(); Console.ReadLine(); } // Reference type (because of 'class') class SomeClassRef { public Int32

c#中struct和class的区别

简单来说,struct是值类型,创建一个struct类型的实例被分配在栈上.class是引用类型,创建一个class类型实例被分配在托管堆上.但struct和class的区别远不止这么简单.本篇主要包括: ■ 概括来讲■ 从赋值的角度体验struct和class的不同■ 从参数传值角度体验struct和class的不同■ 从struct类型的struct类型属性和struct引用类型属性体验struct和class的不同■ 从构造函数体验struct和class的不同■ 从给类型成员赋初值体验s

c#中 ==与equals有什么区别(转载)

c#中 ==与equals有什么区别 对于值类型.引用类型来说比较过程怎样的? using System;using System.Collections.Generic;using System.Text; namespace ConsoleApplication1{    class Person    {        private string name; public string Name        {            get { return name; }      

C++中struct与class的区别

在C++中,既可以用struct关键字进行类的定义,也可以用class关键字进行类的定义,那么这两者到底有什么区别呢? 唯一的一点区别是:struct和class的默认访问权限不一样. 如果我们使用struct关键字,则定义在第一个访问说明符之前的成员是public的:相反,如果使用的是class关键字,则这些成员是private的. 我认为可以这样理解:struct关键字是C风格的类型定义符,class是C++风格的类型定义符,我们知道面向对象的C++具有更好的封装特性,因此会默认将其成员定义

C#中struct与class的区别详解

转自:http://blog.csdn.net/justlovepro/archive/2007/11/02/1863734.aspx 有这么几点不同: 1.struct 是值类型,class是对象类型 2.struct 不能被继承,class可以被继承 3.struct 默认的访问权限是public,而class默认的访问权限是private. 4.struct不能由程序员申明构造函数,即使是默认(不带参数)的构造函数,同样也不能有析构的处理部分.这是因为Struct的构造函数是由编译器自动生

C语言学习笔记 (002) - C++中引用和指针的区别(转载)

下面用通俗易懂的话来概述一下: 指针-对于一个类型T,T*就是指向T的指针类型,也即一个T*类型的变量能够保存一个T对象的地址,而类型T是可以加一些限定词的,如const.volatile等等.见下图,所示指针的含义: 引用-引用是一个对象的别名,主要用于函数参数和返回值类型,符号X&表示X类型的引用.见下图,所示引用的含义: 2.指针和引用的区别 首先,引用不可以为空,但指针可以为空.前面也说过了引用是对象的别名,引用为空--对象都不存在,怎么可能有别名!故定义一个引用的时候,必须初始化.因此

HTTP返回码中301与302的区别 (转载)

一.官方说法 301,302 都是HTTP状态的编码,都代表着某个URL发生了转移,不同之处在于:  301 redirect: 301 代表永久性转移(Permanently Moved). 302 redirect: 302 代表暂时性转移(Temporarily Moved ).  这是很官方的说法,那么它们的区别到底是什么呢? 二.现实中的差异 2.1.对于用户 301,302对用户来说没有区别,他们看到效果只是一个跳转,浏览器中旧的URL变成了新的URL.页面跳到了这个新的url指向的

SQL中select与set的区别-转载

下表列出 SET 与 SELECT 的区别   SELECT SET 同时对多个变量同时赋值时 支持 不支持 表达式返回多个值时 将返回的最后一个值赋给变量 出错 表达式未返回值时 变量保持原值 变量被赋null值 (1).同时对多个变量同时赋值时 declare @a varchar(128), @b varchar(128) SET @a='ABC',@b='EFG' GO --报错:消息 102,级别 15,状态 1,第 3 行 ',' 附近有语法错误. declare @a varcha

Struct和Class的区别

C#的struct结构具有以下特点: 数据类型:结构是值类型,而类是引用类型.数据类型:向方法传递结构时,结构是通过传值方式传递的,而不是作为引用传递的.实例化:与类不同,结构的实例化可以不使用 new 运算符(未验证). 位置:结构可以写到class中,与方法并列:也可以写在class外,与类并列.构造函数:结构可以声明有参数的构造函数,但它们必须给所有的属性赋值(this.x=xx;this.y=yy;...). 若声明无参的构造函数,编译期间报错:编译器错误消息: CS0568: 结构不能