关闭

struct 和class关键字

标签: struct
634人阅读 评论(0) 收藏 举报
分类:

浅谈struct与class关键字
1 c/c++中struct的区别
首先struct是C语言中定义结构体时使用;
而在C++中则可以用来定义类,那它在C++中使用和c
中有什么区别呢,来看下面一段代码

#include   "stdio.h"  
void fun()    
{    
 printf("hello,world ");    
}    
struct test    
{    
  void (*Fun)();  //函数指针,通过它来调用函数 
};   
int main()    
{    
  struct test a;    
  a.Fun = fun;  //一定要这样让一个函数的地址赋值给结构的成员函数  
 (*a .Fun)();  //通过函数地址调用函数   

 return 0;    
}    

此时可以运行,而在换种方式

#include     

struct test    
{     
      void fun(){printf("hello,world ");}   

};   
int main()    
{    
  struct test _t;     

 _t.fun();  

 return 0;
 }    

(1)和上一个相比,这次直接将函数定义在了结构体内,但是并不能运行通过,因此struct在c中定义结构体时不能包含成员函数,只能有成员变量,而在c++中不仅可以有成员变量还可以有成员函数
代码如下:

#include<iostream>
using namespace std;
struct test
{
 void Fun();
 {}
 int a;
 };
 struct test a;
 a.Fun();

(2)结构体中嵌套结构体在计算其大小时

  • 在c中无论加不加结构体标签,编译器都会把它默认计算进去
  • 而在c++中若不加标签,编译器并不会把它计算进去,此时编译器会认为你只是声明了这个变量而并不是定义
    测试代码:
struct A
{
  double d;
  char c;
  int a;
  }
  //此时A的大小为16
  再来定义一个B
  struct B
  {
     struct A
      {
         double d;
         char c;
         int a;
      }c2;
      char c2;
  }
  //在C中无论写不写c2,结果都是24
  //而在c++中若不写c2,运行结果是1,编译器认为此时只有char c2

2 C++中struct和class关键字的区别
(1)在字面上struct定义的通常叫做“结构体”,在C语言里用于将多种数据、多个变量组织在一起,便于表达比较复杂的数据类型,在C++中为了兼容C语言保留了该关键字,并且保留了C语言中的所有功能。
而class,则称作“类”,是C++新增来支持面向对象思想概念中“类”的概念的一个关键词,它不仅可以像C语言中的struct一样把数据组织在一起,还可以将与数据相关的方法组织在一起,并增加了如虚函数、继承等特性来支持面向对象编程。
虽然在字面上struct与class的含义不一样,但在C++中其功能基本是相同的,C++中的struct不仅可以包含数据成员,而且与class一样支持新增的面向对象特性,仅在以下细节上有略微差别。
既然两者在字面上不一样,为了更好地利用这一点,建议在C++中使用struct时仍然只使用C中的特性,来表示一些复杂的数据而不进行方法的封装,这样还可以提高软件的可读性。
(2)默认成员权限不同
- struct的默认成员权限是public
- class的默认成员权限是private
但是实际定义时最好将成员权限显示定义出来
(3)3.默认继承方式
struct的默认继承方式为public,而class的默认继承为private
虽然知道class的默认继承为private,但并不是项目组的每个人都清楚这一点,建议在工程代码中不省略private,使代码可读性更强
(4)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,因为这样读起来更接近人类语言,更具有可读性

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:6700次
    • 积分:234
    • 等级:
    • 排名:千里之外
    • 原创:17篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类