struct与class区别联系(转)
传送门:struct与class区别联系
注意C中的struct和C++中的struct是不一样的,c中的struct比较原生,仅仅是将一些属性封装起来构成一个整体,没有OO的相关特性。而c++中的struct是对c中的struct进行扩展(兼容c中的struct),具备OO的特性,其实c++中的class能干的事情struct几乎都能干,什么继承、多态等都OK。直接看下面代码,不同编译器对结果可能不一样:
`#include <stdio.h>
struct A
{
int a;
//D:\github\cpp_hello_world>gcc -x c structtest.cpp
//structtest.cpp:7:5: error: expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__at
// _’ before ‘{’ token
void print() // pure c, this is not allowd
{
printf("a printf %d\n", a);
}
};
struct B : A
{
int b;
B(int bb)
{
b = bb;
a = -1;
}
B(){b = 0; a = 2;}
};
class C
{
public: // if there's no pubic, cannot use this way: C c = {11};
int c;
char d;
void func() //normal function(no construct/inherit .etc OO properties), you can also use this way: C c = {11};
{
printf("%d, %c\n", c, d);
}
//C(){}
};
struct D
{
int c;
char d;
D() // if there's no Construct or some other OO properties(like inherit), you can use this way: D d = {1,'y'}
{
c = -1;
d = 'x';
}
};
struct E
{
int c;
char d;
void func() //normal function, you can also use this way: E e = {2,'z'};
{
printf("%d, %c\n", c, d);
}
};
struct AA
{
private:
int a;
public:
int b;
};
class BClass: AA
{
public:
void fun()
{
printf("%d\n", b);
}
};
struct BStruct: AA
{
void func()
{
printf("%d\n", b);
}
};
struct Base
{
virtual void fun()
{
printf("Base\n");
}
};
struct Child: Base
{
void fun()
{
printf("Child\n");
}
};
int main()
{
B b, b1(1);
printf("%d, %d \n", b.b, b.a);
printf("%d, %d \n", b1.b, b1.a);
A a = {10};
printf("%d\n", a.a);
C c = {11, 'a'};
C c1 = {'d'}; //convert to int
C c2 = {}; //init with default
C c3;
printf("%d, %c\n", c.c, c.d);
printf("%d, %c, %d\n", c1.c, c1.d, c1.d);
printf("%d, %d\n", c2.c, c2.d);
printf("%d, %c\n", c3.c, c3.d);//uninit, vs2012 will show Run-Time Check Failure #3 window,
c3.func();//uninit, but this way will pass the "Run-Time Check" in vs2012
//D d = {1,'y'}; //error: in C++98 ‘d’ must be initialized by constructo not by ‘{...}’
//printf("%d, %c\n", d.c, d.d);
E e = {2,'z'};
printf("%d, %c\n", e.c, e.d);
e.func();
BClass bclass;
BStruct bstruct;
bclass.fun();
bstruct.func();
//printf("%d", bclass.b); // “AA::b”不可访问,因为“BClass”使用“private”从“AA”继承
printf("%d\n", bstruct.b); //OK
Base base;
Child child;
base.fun();
child.fun();
Base* base2 = &child;
base2->fun();
return 0;
}`
VisualStudio 2012默认debug和release结果:
Image(8)[4]73028934dad360862f6ed22a22a35c24
G++ 4.5.3, 默认和O2(g++ -O2 structtest.cpp)结果:
600b675239e56d6d70ac255f68e353f544e877ad37f3a2a6f5a77577dfb4adc5
mac下的g++(Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn))无优化和O2结果
struct-and-class
不同编译器结果不一样主要是体现在printf函数实现(有空再研究下)下以及C c3的未初始化(注意c2和c3的区别)~ 这也告诉我们一定要注意初始化啊~未初始化的值是未定义的,啥结果可能都有。
可以看出:
区别关键就是访问控制,struct默认是public,class默认是private。包括struct下定义的属性/成员访问控制(默认public),继承方式默认public。几个注意的地方,struct还能继承class,class也能继承struct,一定条件下class也能像struct用{…}初始化构造.当struct/class带有OO特性时,如继承、构造函数、虚函数时,除了默认的访问控制符外,struct跟class行为完全一样。例子中的通过{…}提供参数化列表构造一个实例,class也能通过这样的方式构造。当有继承、构造函数等OO特性定义(非成员函数)时,即便是struct也不能通过{…}初始化构造.
另外,class在c++中还能在模版定义中,类似(typename),而struct不行。
以上算是struct和class的区别和联系吧。核心思想是记住c++中的struct也能用于OOP,与class的默认访问控制权限不一样。
Reference : http://blog.sina.com.cn/s/blog_48f587a80100k630.html
C# struct和class区别: http://www.cnblogs.com/gsk99/archive/2011/05/20/1904552.html
struct与class区别联系(转)的更多相关文章
- struct和class 区别
struct和class区别与联系 关于使用大括号初始化class和struct如果定义了构造函数的话,都不能用大括号进行初始化如果没有定义构造函数,struct可以用大括号初始化.如果没有定义构造函 ...
- struct和class区别
转载来源:http://blog.sina.com.cn/s/blog_48f587a80100k630.html C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据 ...
- struct和typedef struct用法和区别
1 首先://注意在C和C++里不同 1.1 在C中定义一个结构体类型要用typedef: typedef struct Student { int a; }Stu; 于是在声明变量的时候就可:Stu ...
- C++/C中的struct和typedef struct用法和区别
struct和typedef struct 分三块来讲述: 1 首先://注意在C和C++里不同 在C中定义一个结构体类型要用typedef: typedef struct Student { int ...
- <转> Struct 和 Union区别 以及 对内存对齐方式的说明
转载地址:http://blog.csdn.net/firefly_2002/article/details/7954458 一.Struct 和 Union有下列区别: 1.在存储多个成员信息时,编 ...
- struct 和class 区别
最开始,就让我们来讨论一下一个最最基本,也最最容易被人忽视掉的问题——C++中的struct和class有什么区别?如果谈到C中的struct和C++中的class的区别,你应该会告诉我很多.但我现在 ...
- TinyHttpd中sockaddr与struct sockaddr_in的区别
上午学习TinyHttpd的源码,sockaddr 结构体以前没接触过, 在网络编程中经常用到struct sockaddr和struct sockaddr_in,这里简单介绍. 在linux环境下, ...
- 转:struct sockaddr与struct sockaddr_in ,struct sockaddr_un的区别和联系
在linux环境下,结构体struct sockaddr在/usr/include/linux/socket.h中定义,具体如下:typedef unsigned short sa_family_t; ...
- 内置函数new() 和struct{} 初始化的区别
一.new() 这是一个用来分配内存的内置函数,它的第一个参数是一个类型,不是一个值,它的返回值是一个指向新分配的 t 类型的零值的指针.在golang的代码定义如下: func new(t Type ...
随机推荐
- Python制作回合制手游外挂简单教程(上)
引入: 每次玩回合制游戏的时候,反反复复的日常任务让人不胜其烦 玩问道的时候,我们希望能够自动刷道,玩梦幻希望能自动做师门.捉鬼等等 说明: 该外挂只能模拟鼠标键盘操作,并不能修改游戏数据 我这里使用 ...
- vue的路由懒加载
路由懒加载官方介绍 非懒加载写法: import Login from '@/components/Login' 所有路由涉及到的文件会被打包到 app.xxx.js 中 懒加载写法: const L ...
- @JsonProperty和@JsonAlias的区别
@JsonProperty这个注解提供了序列化和反序列化过程中该java属性所对应的名称@JsonAlias这个注解只只在反序列化时起作用,指定该java属性可以接受的更多名称 public stat ...
- Could not load file or assembly ‘ Oracle.ManagedDataAccess.EntityFramework, Version=6.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342’ or one of its dependencies系统找不到指定文件 处理方法
前些天做EF Model-First测试,开发环境为VS2013,数据库为Oracle 11g.所有东西都装好数据模型已经建立后准备执行“根据模型生成数据库”命令时,出现:Could not load ...
- 怎样删除windows.old文件
方法1: 1.在C盘上点右键,选择属性.2.在常规选项卡中点击”磁盘清理“3.稍等片刻再弹出的选项卡中点击清理系统文件4.选中以前Windows的安装5.点击确定即可安全清理 方法二: WIN7中的w ...
- (五)JMM的介绍
1. JMM的介绍 在上一篇文章中总结了线程的状态转换和一些基本操作,对多线程已经有一点基本的认识了,如果多线程编程只有这么简单,那我们就不必费劲周折的去学习它了.在多线程中稍微不注意就会出现线程安全 ...
- cf113D. Museum(期望 高斯消元)
题意 题目链接 Sol 设\(f[i][j]\)表示Petya在\(i\),\(Vasya\)在\(j\)的概率,我们要求的是\(f[i][i]\) 直接列方程高斯消元即可,由于每个状态有两维,因此时 ...
- js 动态声明变量
var object = {}; for(var i=0; i<5; i++){ object['attr'+i] = i; }
- 准备开发一个运行在Android上的JavaME模拟器
在一个虚拟机A上运行另外一个虚拟机B看起来是挺不靠谱的一件事,在手机上运行某个虚拟机也不怎么靠谱.并且如果虚拟机A运行在手机上这个听起来就更不靠谱了.但是很多人就在做这样的事.比如在在手机上运行DOS ...
- Android 监听手机GPS打开状态
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/70854942 本文出自[赵彦军的博客] GPS_Presenter package ...