C++ 类的各种公开、私有、保护成员定义的实际意义?
如题——好吧,我承认不懂C++。很无知的想到:如果提供源文件,无论私有公共都能看见,并可以修改;如果只提供头文件,头文件中只给出可以访问的函数或数据,无论私有公共都改不了...
如题——
好吧,我承认不懂C++。
很无知的想到:如果提供源文件,无论私有公共都能看见,并可以修改;如果只提供头文件,头文件中只给出可以访问的函数或数据,无论私有公共都改不了。程序行为人设计的,如果不是防人,程序自己该不会很随便吧?编译时到底有什么区别?是为了编程序的人还是编译器?定义一个私有数据,然后用一个公共的函数return到底有什么实际价值?
看来我不太懂继承,是我写的类,生成库,我只在头文件和说明中告诉你可以继承使用的函数,其余的公有函数我不说,和私有函数有没有区别? 展开
好吧,我承认不懂C++。
很无知的想到:如果提供源文件,无论私有公共都能看见,并可以修改;如果只提供头文件,头文件中只给出可以访问的函数或数据,无论私有公共都改不了。程序行为人设计的,如果不是防人,程序自己该不会很随便吧?编译时到底有什么区别?是为了编程序的人还是编译器?定义一个私有数据,然后用一个公共的函数return到底有什么实际价值?
看来我不太懂继承,是我写的类,生成库,我只在头文件和说明中告诉你可以继承使用的函数,其余的公有函数我不说,和私有函数有没有区别? 展开
7个回答
展开全部
C++的公有成员、私有成员、保护成员都属于语法范畴,它的作用主要是为了实现C++的面向对象与继承特性。
1、公有成员是接口,打个比方来说,以计算机为例,对于不懂计算机的人来说,不需要告诉对方内部CPU如何动作、内存如何管理,只需要告诉它电源开关在哪里即可,这个电源开关就相当于公开成员,它是一个操作界面。C++面向对象程序设计的一个关键点即是接口编程。拿Windows来说,亦是如此,普通用户通过GUI接口即explorer.exe来完成操作,系统管理员通过控制台接口即cmd命令提示符来操作,程序员通过SDK中的API函数来完成操作。
2、私有成员 ,这只是变换了一个名称,程序=数据结构+算法,算法是用来操作数据的,一个程序不可能是没有数据的,私有成员即是用户通过接口操作的对象。因此,一般私有成员都是数据成员,偶尔会有一些私有的成员函数,即不想开放给用户的接口。
3、保护成员,C++一个很重要的特性是实现继承,也叫做派生,派生一词最早出现于亚理士多德的《工具论》,中国古代的诸子百家中有一家叫做名家,著名的白马非马的故事就是出自于此,派生的概念类似于马和白马的关系。用数学集合的观点来看,马是一个集合,白马是马的子集,派生实际上实现的就是这种子集关系,子类要继承基类的数据成员,就牵涉到一个数据共享的问题,因为继承的时候,基类的私有成员在派生类中依然是基类的私有成员,否则,私有成员就没有任何意义,基类的公有成员在派生类中依然是公有的,因此这里面有一个局限性,即如何让基类的成员,能成为派生类的私有成员,这样能够更好的实现基类的可扩展性,因此才引入了保护成员的概念。
1、公有成员是接口,打个比方来说,以计算机为例,对于不懂计算机的人来说,不需要告诉对方内部CPU如何动作、内存如何管理,只需要告诉它电源开关在哪里即可,这个电源开关就相当于公开成员,它是一个操作界面。C++面向对象程序设计的一个关键点即是接口编程。拿Windows来说,亦是如此,普通用户通过GUI接口即explorer.exe来完成操作,系统管理员通过控制台接口即cmd命令提示符来操作,程序员通过SDK中的API函数来完成操作。
2、私有成员 ,这只是变换了一个名称,程序=数据结构+算法,算法是用来操作数据的,一个程序不可能是没有数据的,私有成员即是用户通过接口操作的对象。因此,一般私有成员都是数据成员,偶尔会有一些私有的成员函数,即不想开放给用户的接口。
3、保护成员,C++一个很重要的特性是实现继承,也叫做派生,派生一词最早出现于亚理士多德的《工具论》,中国古代的诸子百家中有一家叫做名家,著名的白马非马的故事就是出自于此,派生的概念类似于马和白马的关系。用数学集合的观点来看,马是一个集合,白马是马的子集,派生实际上实现的就是这种子集关系,子类要继承基类的数据成员,就牵涉到一个数据共享的问题,因为继承的时候,基类的私有成员在派生类中依然是基类的私有成员,否则,私有成员就没有任何意义,基类的公有成员在派生类中依然是公有的,因此这里面有一个局限性,即如何让基类的成员,能成为派生类的私有成员,这样能够更好的实现基类的可扩展性,因此才引入了保护成员的概念。
Storm代理
2023-08-29 广告
2023-08-29 广告
"StormProxies是全球大数据IP资源服务商,其住宅代理网络由真实的家庭住宅IP组成,可为企业或个人提供满足各种场景的代理产品。点击免费测试(注册即送1G流量)StormProxies有哪些优势?1、IP+端口提取形式,不限带宽,I...
点击进入详情页
本回答由Storm代理提供
展开全部
这些东西都是为了避免犯错,而不是避免蓄意的阴谋。
类的各种公开、私有、保护是用来区分实现与接口部分(比较低层次的)。类的公有成员定义了类的功能(接口),这些接口定义了这个类能做什么,不能做什么,这个类因为这个接口而存在。而类的私有成员和保护成员定义了类的实现部分,这些实现部分可能因为性能、可靠性而经常改动。 通过在编程语言中区分出接口和实现,可以让程序员以最小的代价去修改代码,可以让用户在阅读我们的代码时知道应该关注那些东西而不应该关注那些东西,同时也让编译器能检查出用户代码非法使用类实现代码的情况。
这是为了避免犯错以及时代码清晰而已,你所的那个防人,现在的技术做不到。
C++的继承、静态多态(模板)和动态多态(virtual函数)则把接口与分离的原则发挥到了极致。
公开、私有、保护成员在编译前和编译后有什么区别?
没什么区别,public、private、protected限制的是名字使用而已,也就是说你也可以在代码中通过指针访问私有保护成员,但是如我前面说的:这些东西都是为了避免犯错,而不是避免蓄意的阴谋。
你说的那个隐藏细节的那个问题,有一些技术可以做到的,比如说使用句柄类技术,可以在类的声明中只保留一个成员指针,而所有的细节都隐藏在这个指针的后面。
定义一个私有数据,然后用一个公共的函数return到底有什么实际价值?
如果将来某一天你决定将这个变量换成其他的,那你就只需要修改那个return这个变量的函数就可以了。还有这种做法有助于排错的。
找一些国外的书看吧,现在有些书说得都很浅的,只是讲语法。
类的各种公开、私有、保护是用来区分实现与接口部分(比较低层次的)。类的公有成员定义了类的功能(接口),这些接口定义了这个类能做什么,不能做什么,这个类因为这个接口而存在。而类的私有成员和保护成员定义了类的实现部分,这些实现部分可能因为性能、可靠性而经常改动。 通过在编程语言中区分出接口和实现,可以让程序员以最小的代价去修改代码,可以让用户在阅读我们的代码时知道应该关注那些东西而不应该关注那些东西,同时也让编译器能检查出用户代码非法使用类实现代码的情况。
这是为了避免犯错以及时代码清晰而已,你所的那个防人,现在的技术做不到。
C++的继承、静态多态(模板)和动态多态(virtual函数)则把接口与分离的原则发挥到了极致。
公开、私有、保护成员在编译前和编译后有什么区别?
没什么区别,public、private、protected限制的是名字使用而已,也就是说你也可以在代码中通过指针访问私有保护成员,但是如我前面说的:这些东西都是为了避免犯错,而不是避免蓄意的阴谋。
你说的那个隐藏细节的那个问题,有一些技术可以做到的,比如说使用句柄类技术,可以在类的声明中只保留一个成员指针,而所有的细节都隐藏在这个指针的后面。
定义一个私有数据,然后用一个公共的函数return到底有什么实际价值?
如果将来某一天你决定将这个变量换成其他的,那你就只需要修改那个return这个变量的函数就可以了。还有这种做法有助于排错的。
找一些国外的书看吧,现在有些书说得都很浅的,只是讲语法。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
将一些操作写成函数形式是为了提供公共操作,可以简化代码,让程序步骤更清晰。
要访问一个私有数据成员,你当然可以把那个成员改成公有的,然后直接访问。但是如果这个类被继承的话,那就会出现问题了,因为这个被改成公有的数据成员也会被继承,这有时候会造成访问冲突,用私有来进行访问控制就可以解决这个问题。
有时候用函数的形式来访问数据,是一种习惯,这在编写复杂的程序的时候很有用。比如在你需要改程序的时候,你仅仅需要改这个函数的实现,而不用改函数名。
假如有一个函数是返回税率的,
get(){return ele}假设现在的税率是这个ele,直接保存在类内的
以后有一天,税率不是这个ele了,而是另一种计算方法了,
get(){return ele + a*20%+b;} 假设税率是这样算了,那么要改动的仅仅是get()函数里面的实现。
那么就算有多少个地方用到get()函数,都不用去修改。
但是,如果税率一开始你是用ele直接访问表示的。那么你就需要改动 所以需要用到ele的地方。这对一个复杂的程序来说,是很难的,而且非常容易出错。
要访问一个私有数据成员,你当然可以把那个成员改成公有的,然后直接访问。但是如果这个类被继承的话,那就会出现问题了,因为这个被改成公有的数据成员也会被继承,这有时候会造成访问冲突,用私有来进行访问控制就可以解决这个问题。
有时候用函数的形式来访问数据,是一种习惯,这在编写复杂的程序的时候很有用。比如在你需要改程序的时候,你仅仅需要改这个函数的实现,而不用改函数名。
假如有一个函数是返回税率的,
get(){return ele}假设现在的税率是这个ele,直接保存在类内的
以后有一天,税率不是这个ele了,而是另一种计算方法了,
get(){return ele + a*20%+b;} 假设税率是这样算了,那么要改动的仅仅是get()函数里面的实现。
那么就算有多少个地方用到get()函数,都不用去修改。
但是,如果税率一开始你是用ele直接访问表示的。那么你就需要改动 所以需要用到ele的地方。这对一个复杂的程序来说,是很难的,而且非常容易出错。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-03-23
展开全部
封装啊少年...这些东西吧,做过实际项目就懂了。
私有啊,就是派生类里不能访问,外界也不能访问,只能是类内部调用啊。这样使用类起来就很简单啊,主要是处于项目维护的需要。经常性的,我做c++开发的时候,经常写一个基础类,里面有20-50多个成员函数,有一些类给是外面程序里使用的函数,我们给它做成public的,这样其他开发人员要使用我写的类,就直接看那些public的函数就行了,至于那些private的,直接不用看。你没写过几行代码。正在你做个小型项目,5K行-8K行代码的,你就体会到了。还有就是,private的其他意义在于,如果你继承了一个之前写的类,如果那个类里面所有函数都是public,然后你随意调用了里面的方法,然后呢,你发现一个函数需要改,然后你不得不去改所有调用了那个函数的代码,因为你所有函数都是public,派生类可以随意调用,这样基类和派生类直接的耦合性就太强了,这还算简单的,很多时候一个基类都派生出4-5个类,一个类代码量经常有个4K-5K多行的样子,这样该一个函数,所有的函数都要该,是个人都会崩溃的。所有,public和private还有protected实质还是类设计思想的规划。
至于你说的return,那个是叫做标准,也可以说是规范,没啥实际意义。要说实际意义嘛,你也可以不用C++,用纯C去写也没人管你,一个main函数写个几万行代码也行,这都随意。但是规范就说不要这样写,因为你写的太少了,不能体会到这样做的坏处,体会到了这样的坏处,就理解了规范的意义的。
私有啊,就是派生类里不能访问,外界也不能访问,只能是类内部调用啊。这样使用类起来就很简单啊,主要是处于项目维护的需要。经常性的,我做c++开发的时候,经常写一个基础类,里面有20-50多个成员函数,有一些类给是外面程序里使用的函数,我们给它做成public的,这样其他开发人员要使用我写的类,就直接看那些public的函数就行了,至于那些private的,直接不用看。你没写过几行代码。正在你做个小型项目,5K行-8K行代码的,你就体会到了。还有就是,private的其他意义在于,如果你继承了一个之前写的类,如果那个类里面所有函数都是public,然后你随意调用了里面的方法,然后呢,你发现一个函数需要改,然后你不得不去改所有调用了那个函数的代码,因为你所有函数都是public,派生类可以随意调用,这样基类和派生类直接的耦合性就太强了,这还算简单的,很多时候一个基类都派生出4-5个类,一个类代码量经常有个4K-5K多行的样子,这样该一个函数,所有的函数都要该,是个人都会崩溃的。所有,public和private还有protected实质还是类设计思想的规划。
至于你说的return,那个是叫做标准,也可以说是规范,没啥实际意义。要说实际意义嘛,你也可以不用C++,用纯C去写也没人管你,一个main函数写个几万行代码也行,这都随意。但是规范就说不要这样写,因为你写的太少了,不能体会到这样做的坏处,体会到了这样的坏处,就理解了规范的意义的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
谈谈我的看法,类是面向对象的基石,类说白了只是一种封装了数据和操作数据的容器而已它可以让我们设计程序相对于面向过程会更加简单抽象化,类里面设置的这些属性私有等不是用来防人的,只是为了在类的使用过程中减少出错。大型程序的代码量往往相当可观,我们使用类尤其是别人写的,我们其实更在意与类的接口怎么使用并不想知道内部的 实现机制,而且给你看你也不见的想看,就给我们电脑一样我们只是想拿来用它,但是我并不想知道它内部构造是怎么协同工作的,但是为了防止使用者破坏它,我给它加个机壳仅此而已
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询