C++中结构体与类的区别 2
这里有两种情况下的区别。
(1)C的struct与C++的class的区别。
(2)C++中的struct和class的区别。
在第一种情况下,struct与class有着非常明显的区别。C是一种过程化的语言,struct只是作为一种复杂数据类型定义,struct中只能定义成员变量,不能定义成员函数。例如下面的C代码片断:
struct Point
{
int x; // 合法
int y; // 合法
void print()
{
printf("Point print\n"); //编译错误
};
};
这里第7行会出现编译错误,提示如下的错误消息:“函数不能作为Point结构体的成员”。因此大家看到在第一种情况下struct只是一种数据类型,不能使用面向对象编程。现在来看第二种情况。
首先请看下面的代码(c++版本):
#include <iostream>
using namespace std;
class CPoint
{
int x; //默认为private
int y; //默认为private
void print() //默认为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
void print() //默认为public
{
cout << "SPoint: (" << x << ", " << y << ")" << endl;
}
SPoint(int x, int y) //构造函数,默认为public
{
this->x = x;
this->y = y;
}
private:
void print1() //private类型的成员函数
{
cout << "SPoint: (" << x << ", " << y << ")" << endl;
}
}; int main(void)
{
CPoint cpt(, ); //调用CPoint带参数的构造函数
SPoint spt(, ); //调用SPoint带参数的构造函数 cout << cpt.x << " " << cpt.y << endl; //编译错误
cpt.print(); //编译错误
cpt.print1(); //合法 spt.print(); //合法
spt.print1(); //编译错误
cout << spt.x << " " << spt.y << endl; //合法 return ;
}
在上面的程序里,struct还有构造函数和成员函数,其实它还拥有class的其他特性,例如继承、虚函数等。因此C++中的struct扩充了C的struct功能。那它们有什么不同呢?
main函数内的编译错误全部是因为访问private成员而产生的。因此我们可以看到class中默认的成员访问权限是private的,而struct中则是public的。在类的继承方式上,struct和class又有什么区别?请看下面的程序:
#include <iostream>
using namespace std;
class CBase
{
public:
void print() //public成员函数
{
cout << "CBase: print()..." << endl;
}
};
class CDerived1 : CBase //默认private继承
{
}; class CDerived2 : public Cbase //指定public继承
{
}; struct SDerived1 : Cbase //默认public继承
{
}; struct SDerived2 : private Cbase //指定public继承
{
}; int main()
{
CDerived1 cd1;
CDerived2 cd2;
SDerived1 sd1;
SDerived2 sd2; cd1.print(); //编译错误
cd2.print();
sd1.print();
sd2.print(); //编译错误 return ;
}
可以看到,以private方式继承父类的子类对象不能访问父类的public成员。class继承默认是private继承,而struct继承默认是public继承。
另外,在C++模板中,类型参数前面可以使用class或typename,如果使用struct,则含义不同,struct后面跟的是“non-type template parameter”,而class或typename后面跟的是类型参数。
事实上,C++中保留struct的关键字是为了使C++编译器能够兼容C开发的程序。
答案:
分以下所示两种情况。
C的struct与C++的class的区别:struct只是作为一种复杂数据类型定义,不能用于面向对象编程。
C++中的struct和class的区别:对于成员访问权限以及继承方式,class中默认的是private的,而struct中则是public的。class还可以用于表示模板类型,struct则不行。
C++中结构体与类的区别 2的更多相关文章
- C#中结构体和类的区别
结构体和类同样能够定义字段,方法和构造函数,都能实例化对象,这样看来结构体和类的功能好像是一样的了,但是他们在数据的存储上是不一样的 C#结构体和类的区别问题:这两种数据类型的本质区别主要是各自指向的 ...
- C#中结构体与类的区别
一.结构体和类非常相似 1,定义和使用非常相似,例子如下:public struct Student{ string Name; int Age;}public class Questio ...
- C++中结构体与类的区别(结构不能被继承,默认是public,在堆栈中创建,是值类型,而类是引用类型)good
结构是一种用关键字struct声明的自定义数据类型.与类相似,也可以包含构造函数,常数,字段,方法,属性,索引器,运算符和嵌套类型等,不过,结构是值类型. 1.结构的构造函数和类的构造函数不同. a. ...
- C++中结构体与类的区别(struct与class的区别)
转载来源:http://blog.sina.com.cn/s/blog_48f587a80100k630.html C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据 ...
- C++中结构体与类的区别 1
转载来源:http://blog.sina.com.cn/s/blog_48f587a80100k630.html C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据 ...
- [转]C#中的结构体与类的区别
C#中的结构体与类的区别 经常听到有朋友在讨论C#中的结构与类有什么区别.正好这几日闲来无事,自己总结一下,希望大家指点. 1. 首先是语法定义上的区别啦,这个就不用多说了.定义类使用关键字cla ...
- C C++ 中结构体与类
先来说说C和C++中结构体的不同 a) C语言中的结构体不能为空,否则会报错 1>d:\myproject\visual studio 2013\projects\myc++\main.c(71 ...
- C#结构体和类的区别(转)
结构体和类的区别: 在做一个项目时,使用了较多的结构体,并且存在一些结构体的嵌套,即某结构体成员集合包含另一个结构体等,总是出现一些奇怪的错误,才终于下决心好好分析一下到底类和结构体有啥不同,虽 ...
- C++中 结构体和类的异同
在C++中,结构体是一种特殊形态的类. 结构体和类的唯一区别就是: 结构体和类具有不同的默认访问控制属性. 类中,对于未指定访问控制属性的成员,其访问控制属性为私有类型(private) 结构体中, ...
随机推荐
- Linux:xargs命令详解
xargs 给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具.它擅长将标准输入数据转换成命令行参数,xargs能够处理管道或者stdin并将其转换成特定命令的命令参数.xargs也可以将单行 ...
- [Python] 比较两个数组的元素的异同
通过set()获取两个数组的交/并/差集: print set(a) & set(b) # 交集, 等价于set(a).intersection(set(b)) print set(a) | ...
- topcoder WCNMLGB
点开题->断开连接->再也上不去->我玩NM
- HTTP 1.1 协议规范
1. 内容协商 请求一个特殊编码的过程在 HTTP 1.1 规范中称为内容协商:
- boost split字符串
boost split string , which is very convenience #include <string> #include <iostream> #in ...
- ThreadDeath 理解
public class RunnableTest2 { public static Object obj1 = new Object(); public static Object obj2 = n ...
- LOJ2611. NOIP2013 积木大赛 【线段树】
LOJ2611. NOIP2013 积木大赛 LINK 题目大意是给你一个目标状态数组 每次你可以选择一个连续区间加上一个值,求最小操作次数 我是神奇的脑子 最近做数据结构疯了 然后看见这题就数据结构 ...
- 理解 C# 项目 csproj 文件格式的本质和编译流程
写了这么多个 C# 项目,是否对项目文件 csproj 有一些了解呢?Visual Studio 是怎么让 csproj 中的内容正确显示出来的呢?更深入的,我能够自己扩展 csproj 的功能吗? ...
- WPF 自定义键盘焦点样式(FocusVisualStyle)
WPF 自带的键盘焦点样式是与传统控件样式搭配的,但 WPF 凭着其强大的自定义样式的能力,做出与传统控件样式完全不同风格的 UI 简直易如反掌.这时,其自带的键盘焦点样式(FocusVisualSt ...
- Unrecoverable error: corrupted cluster config file.
from: https://www.cnblogs.com/topicjie/p/7603227.html 缘起 正在欢乐的逗着孩子玩耍,突然间来了一通电话,值班人员告诉我误重启了一台服务器,是我负责 ...