• 10831阅读
  • 30回复

【提问】请高手指教——结构和类的区别 [复制链接]

上一主题 下一主题
离线pinkscut
 
只看楼主 倒序阅读 楼主  发表于: 2005-08-27
以前就觉得结构和类的区别很明显,类可以有函数,结构只有一些变量成员,但是现在知道了结构里面也可以有函数,不过是指针函数,也知道结构可以构成面向对象的。
现在倒有点糊涂了,这两个的区别到底是什么啊?
谢谢大家的指教^_^
[ 此贴被XChinux在2005-08-27 11:05重新编辑 ]
离线XChinux

只看该作者 1楼 发表于: 2005-08-27
只记住一点就行了:
  如果我们只是要数据结构,而不要方法,那就用struct,如果非此,就用class
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线oosky

只看该作者 2楼 发表于: 2005-08-27
回来看看。想不到这帖子讨论这么激烈。
更正:
在C++中,结构和类木有什么区别。结构默认是public,类默认为private。
就如一楼的,一语道明。
[ 此贴被oosky在2005-08-31 18:15重新编辑 ]
离线pinkscut
只看该作者 3楼 发表于: 2005-08-27
结构有自己的函数??
那要给函数赋值的时候怎么办?
struct A{
void B(){}
}C
难道是A.*B=*D()?
离线giscn
只看该作者 4楼 发表于: 2005-08-27
c++里吗?
struct和class是一样的,差别就是 struct的成员 默认是public的,
http://nzt.spaces.live.com
离线pinkscut
只看该作者 5楼 发表于: 2005-08-27
楼上的,差别应该还有oosky说的吧??
离线风中纸页
只看该作者 6楼 发表于: 2005-08-27
关键是“是否具有面向对象”的特征,即继承、封装......
把问题先交给google,再交给你的朋友。谢谢。
离线giscn
只看该作者 7楼 发表于: 2005-08-28
struct支持class的一切特性,包括所谓的oo特征,c++里struct的引用只为了兼容起见
区别?struct默认是public,不仅类成员,还包括继承的时候也默认是public
建议你们试验一下
http://nzt.spaces.live.com
离线magicoy

只看该作者 8楼 发表于: 2005-08-28
试过~
不过记好.C++中的struct和class的确有很多相似之处.
但是C中的struct和class区别就相差大了~
永 远 记 得 : 做 人 厚 道 一 点 好 。

离线magicoy

只看该作者 9楼 发表于: 2005-08-28
等你把C++类学完了你才理解类可以当然新一门语言.
而struct只能看成一"数据类型"(自己定义的)
永 远 记 得 : 做 人 厚 道 一 点 好 。

离线giscn
只看该作者 10楼 发表于: 2005-08-28
C里有class吗?
http://nzt.spaces.live.com
离线magicoy

只看该作者 11楼 发表于: 2005-08-28
没有class
只是和C++中的class比较
最简单的说法
struct Tdata
{
  int iNumber;
};
struct Tdata a1,a2;
////////////////////////上面的可以是C中的也可以是C++中的
struct Tdata
{
  int iNumber;
};
Tdata a1,a2;
///////////////////////这个就只能是C++中的了.
看到了吗?第二个是不是和类很相似.再想想我上面几楼说的话............
有没有感觉?
永 远 记 得 : 做 人 厚 道 一 点 好 。

离线giscn
只看该作者 12楼 发表于: 2005-08-28
哈哈
http://nzt.spaces.live.com
离线magicoy

只看该作者 13楼 发表于: 2005-08-28
哈P
永 远 记 得 : 做 人 厚 道 一 点 好 。

离线giscn
只看该作者 14楼 发表于: 2005-08-29
下面是引用magicoy于2005-08-28 18:22发表的:
哈P


13楼的,
你的11楼回帖 根本是没有任何意义,你拿c里的strut跟c++里的class比什么比,你有毛病没有。明天你是否还要扯出,c#里的struct跟c++里的class的区别呢。lz问的问题是同在c++里面struct和class有什么区别。对你的11楼这种无知的帖子哈哈两下,已经是很给你面子了。但你居然还没有意识到,我就索性给你讲明白吧!

建议你去读c/c++方面的书,等明白了再说事。
http://nzt.spaces.live.com
离线kls
只看该作者 15楼 发表于: 2005-08-29
下面是引用magicoy于2005-08-28 03:01发表的:
没有class
只是和C++中的class比较
最简单的说法
struct Tdata
{
.......

我也要哈哈两下,你是牛头不对马尾嘛!
悄悄地问,你学过c++没有?
c++里struct 不能写成下面形式吗?

struct DerivedTdata: Tdata
{
public:
DerivedTdata (void);
~DerivedTdata(void);

public:
void fooBar();

private:
int data1;
int data2;
};


小毛孩,啥都不懂,还要称老大,学着点
离线enjoyo
只看该作者 16楼 发表于: 2005-08-29
class 和struct有以下的不同

1.class的成员变量和函数有私有保护公共这份,struct没有
2.class可以继承,struct不可以
3.class大多数是堆分配,struct是栈分配,这一点在c++中不是很明显,因为在c++中class也可以是栈分配,但在其他语言,如C#就不一样了
最专业的软件技术社区:华竹技术论坛

http://sinoprise.com

http://sinoprise.net
离线enjoyo
只看该作者 17楼 发表于: 2005-08-29
如果你的程序对以上三条没有要求,则可以选则使用class或struct。
最专业的软件技术社区:华竹技术论坛

http://sinoprise.com

http://sinoprise.net
离线enjoyo
只看该作者 18楼 发表于: 2005-08-29
C语言中没有class,但是有struct.C++中的struct是C语言中的struct的扩展,在C语言中的struct不可以有成员函数,可以有成员的函数指针,我没见过在c语言中的struct有成员函数的。

如果老兄试过了可以,烦劳跟贴告诉小弟一声
最专业的软件技术社区:华竹技术论坛

http://sinoprise.com

http://sinoprise.net
离线giscn
只看该作者 19楼 发表于: 2005-08-29
下面是引用enjoyo于2005-08-29 11:21发表的:
class 和struct有以下的不同
1.class的成员变量和函数有私有保护公共这份,struct没有
2.class可以继承,struct不可以
3.class大多数是堆分配,struct是栈分配,这一点在c++中不是很明显,因为在c++中class也可以是栈分配,但在其他语言,如C#就不一样了



又来一个误导观众的,呵呵。
首先明确,大家要讨论的是 c++里的 struct和class吧?不要再拿 c里的struct和c++里的class来说事了。

给你做了个例子,你自己编译去,然后再告诉我你的1,2,3点,错在什么地方?
-------------------------------
// struct.h
//

using namespace std;

class A
{
public:
     virtual void output();
private:
     int i;
};

struct B: A   //这是继承吧?
{
public:
     void output();
private:
     int j; //这是私有吧?

};

-------------------------------
// struct.cpp
//

#include "stdafx.h"

void A::output()
{
     cout<<"this is A";
}

void B::output()
{
     cout<<"this is B";
}


-------------------------------
// stdafx.h : 标准系统包含文件的包含文件,
// 或是常用但不常更改的项目特定的包含文件
//

#pragma once


#include <iostream>
#include <tchar.h>

// TODO: 在此处引用程序要求的附加头文件
#include "struct.h"


-------------------------------
// stdafx.cpp : 只包括标准包含文件的源文件
// testStruct.pch 将成为预编译头
// stdafx.obj 将包含预编译类型信息

#include "stdafx.h"

// TODO: 在 STDAFX.H 中
//引用任何所需的附加头文件,而不是在此文件中引用

-------------------------------
// testStruct.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
     A* b=new B(); //这是分配在heap还是stack?
     b->output();
     delete b;

     return 0;
}
http://nzt.spaces.live.com
离线XChinux

只看该作者 20楼 发表于: 2005-08-29
在C++ Reference中看到的资料(和我以前所理解的一样):
现在这个争论可以就此打住了。
C++中的struct和class相似,除了其默认的成员是public的,而class的默认成员是private的。
而在C中,struct只能含有数据(请注意,所谓函数指针,其实也是数据,只是个指针而已),并且不允许继承
Syntax:

struct struct-name : inheritance-list {
public-members-list;  
protected:
protected-members-list;
private:
private-members-list;
} object-list;


Structs are like `classes`, except that by default members of a struct are public rather than private. In C, structs can only contain data and are not permitted to have inheritance lists. For example:

  struct Date {
  int Day;
  int Month;
  int Year;
  };

权威声明,见下面这个帖子:
http://www.qtcn.org/bbs/read.php?tid=1256
[ 此贴被XChinux在2005-08-30 10:03重新编辑 ]
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线giscn
只看该作者 21楼 发表于: 2005-08-29
这里没认真学c/c++的人不在少数,楼上有时间的话给他们培训一下,每人收一点钱,你就发了,哈哈
http://nzt.spaces.live.com
离线XChinux

只看该作者 22楼 发表于: 2005-08-29
其实,就按我在本贴二楼说的那样,
如果只是数据结构,那就用struct,
如果非此,就用class。
符合人们的传统习惯
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线magicoy

只看该作者 23楼 发表于: 2005-08-29
下面是引用giscn于2005-08-27 16:10发表的:
c++里吗?
struct和class是一样的,差别就是 struct的成员 默认是public的,


自己不知道廉耻.
自己先提出这牛头不对马嘴吧的问题.哈哈........我也来笑两个.......
自己看我在回第一个贴以上是谁先提到这些没关系说出有关系的问题.哈哈.我又来哈哈两下.
永 远 记 得 : 做 人 厚 道 一 点 好 。

离线pinkscut
只看该作者 24楼 发表于: 2005-08-29
其实也没什么好吵的啦。
每个人都有自己的看法,我们在这里主要是讨论的,那当然得说出自己的看法,看法当然有错有对的,别人错了就指正就行了,也不用太过激动。再说了,别人懂的你可能又不懂,那你自己当然也希望别人能指出你的不懂之处了。
大家在这里主要是互相学习D
^_^
离线ratzip

只看该作者 25楼 发表于: 2005-08-29
struct的成员默认的是public;
class成员默认的是private;
BLOG: http://www.juntuan.cn/user1/999/index.shtml
离线gongyh

只看该作者 26楼 发表于: 2005-08-30
主要区别是:结构没有方法,还有就是权限不一样,除去这些,就可以认为结构和类是一样的,设计者是为了和c语言兼容,才保留结构的。
打工不是一辈子的事!
离线magicoy

只看该作者 27楼 发表于: 2005-08-30
哎.以后giscn的问题大家算是不敢回了.
回错了还会骂人.
讽刺别人说去收小费...........
我和enjoyo\好心回贴...........他竟~``
哎.如果败类都有...............
中国多了会有后患啊............

难道每个人回的贴都必须是你的意思吗?如果错了或者和你想法不同.你就有权BS别人吗.........
大家可以凭凭........
我可和enjoyo都是好心.~```回贴..没想到.............
以后绝对不.........................
大家以后回他贴注意一点要和他想法一样.不然小心和我或者 enjoyo一样哦...
我以后是不敢回他贴了.哈哈............
中国这样的人败坏了一个国家.
永 远 记 得 : 做 人 厚 道 一 点 好 。

离线enjoyo
只看该作者 28楼 发表于: 2005-08-30
giscn说话确实有点太损了,呵呵,大家看开一点吧,我也确实没有注意到C++中的Struct 如此的灵活,不过giscn老兄也有点。。。

数组大家都知道是在栈中分配的,那么

int *p=malloc(size(int)*4);

这个数组是在什么在方分配呢

这个是在堆上分配的
最专业的软件技术社区:华竹技术论坛

http://sinoprise.com

http://sinoprise.net
离线enjoyo
只看该作者 29楼 发表于: 2005-08-30
即使是类在C++中也有两中分配方式,

一种是自动分配,如

classname a;

这种分配方式是栈分配,特点是,你无需管理对象的生存周期,如果此对象非静态对象,那么当对象a不可见时,a 就自己释放了内存,由于栈的空间了限,故,这种方法在某些场合下不适用

另一种是堆分配,如

classname *a = new classname();

这种方式使用的是堆分配,所以在该对a释放的时候,你自己必须将a显式的释放。也就是说你自己必须管理对象a的生存周期。
最专业的软件技术社区:华竹技术论坛

http://sinoprise.com

http://sinoprise.net
离线acefunware

只看该作者 30楼 发表于: 2005-09-05
想不到这个问题会讨论成这种样子
大家和气生财吗..
呵呵
在c++中
如2楼说的就可以了
有时候用什么是个人喜好啊
你也可以用C++象c一样写程序啊
我觉得这是信仰问题
就象有人认为
class name{
....
};

有人认为
class name
{
....
};
管他呢,穿别人的鞋,走自己的路,让别人找鞋去吧! 哈哈
自己用的顺手就行了啊
email:acefunware@yahoo.com.cn
blog:http://acefunware.shineblog.com
快速回复
限100 字节
 
上一个 下一个