精华内容
下载资源
问答
  • 众所周知,的私有变量是无法在外直接访问的,只能通过成员函数访问。 且看下面一段代码: class Stock { private: double total_val;//这是私有的哦~ public: Stock();//默认构造函数 Stock(const ...

    在学习C++ Primer Plus的过程中,遇到一个有趣的问题。

    众所周知,类的私有变量是无法在类外直接访问的,只能通过类的成员函数访问。

    且看下面一段代码:

    class Stock
    {
    private:
    	double total_val;//这是私有的哦~
    public:
    	Stock();//默认构造函数
    	Stock(const char* co, int n = 0, double pr = 0.0);
    	~Stock();//析构函数
    	const Stock& topval(const Stock& s)const;
    };

    可以看到total_val变量是类的私有变量。

    const Stock& Stock::topval(const Stock& s)const
    {
    	if (s.total_val > total_val)
    	{
    		return s;
    	}
    	else
    	{
    		return *this;
    	}
    }

    上面代码中,topval(const Stock& s)是类的一个成员函数,其参数是一个Stock类的引用。

    有趣的事情发生了,在topval(const Stock& s)中能访问total_val变量是可以接受的,但是竟然可以访问到传入的另一个Stock类对象的私有数据s.total_val。

    我们新建一个其他类,看看能否在Stock的成员函数中访问其私有数据。

    class Test
    {
    private:
    	int port = 8080;
    public:
    	const char* ip = "127.0.0.1";
    };

    然后修改Stock类,添加一个成员函数。

    class Stock
    {
    private:
    	double total_val;
    public:
    	Stock();//默认构造函数
    	Stock(const char* co, int n = 0, double pr = 0.0);
    	~Stock();//析构函数
    	const Stock& topval(const Stock& s)const;
    	const Stock& ftest(const Test& t)const;//添加这一行代码
    };

    在新添加的成员函数中进行测试如下:

    const Stock& Stock::ftest(const Test& t)const
    {
    	std::cout << t.ip;
    	std::cout << t.port;
    	return *this;
    }

    结果并不意外,

    可以访问Test类对象的公有数据port,但是在访问Test类对象的私有数据ip时报错“无法引用”。

    我们修改Test类的声明,使Stock成为Test类的一个友元类。

    class Test
    {
    private:
    	int port = 8080;
    	friend class Stock;//添加这一行代码
    public:
    	const char* ip = "127.0.0.1";
    };

    这时,测试函数便不再报错。

    其实,我们咬文嚼字一下,书上的描述“类方法可以访问类的private组件”,其描述范围是“类”。因此,无论创建多少的类的对象,类的成员函数(无论调用对象是哪个)都可以访问到任一对象的私有数据。如果究其原因,应该是“同一个类的所有对象共享同一组类方法”。

     

    总结:在类的成员函数中可以访问本类的私有数据,即使是通过函数参数传入的本类的另一个对象的私有数据,也可以正常访问,即“本类的私有数据”由所有本类的对象的私有数据组成。但是在A类中无法直接访问B类的私有数据,但可以通过友元类实现。

    展开全文
  • C++类成员函数可以访问同类不同对象的私有成员

    千次阅读 多人点赞 2019-01-29 20:38:25
    example 如下例: class Test { public: Test(int v) : val(v) ...同一个类可以访问所有自己实例的私有成员, 数据成员私有而不是实例私有, 成员是否可访问的性质, 而不是对象的性质

    example

    如下例:

    class Test
    {
    public:
    	Test(int v) : val(v)
    	{}
    	Test(const Test& t)
    	{ val = 100; cout << t.val << endl; }
    	void show(Test a) 
    	{ cout << a.val << endl; cout << val << endl; }
    	
    private:
    	int val;
    };
    
    int main() 
    {
    	Test v1(99);		//v1.val = 99
    	Test v2(v1);		//v2.val = 100
    	v1.show(v2);
    }
    

    结果如下例:

    99		//第一次拷贝构造
    100		//传参调用了拷贝构造
    100		//执行show()
    99		//执行show()
    

    疑问

    难道我们不应该提供几个public的接口给Test返回其类内私有成员val么?

    引用C++标准原文

    A member of a class can be
    — private; that is, its name can be used only by members and friends of the class in which it is
    declared.
    — protected; that is, its name can be used only by members and friends of the class in which it is
    declared, and by members and friends of classes derived from this class (see 11.5).
    — public; that is, its name can be used anywhere without access restriction.

    访问限制标号是针对类而不是针对一个类的不同对象,只要同属一个类就可以不用区分同一个类的不同对象。因为 是类的成员函数,所以有权限访问私有数据成员。如果是在main函数中直接,那肯定就会报错了,不能访问,因为这是在类外不能访问私有数据成员。一个类的成员函数可以访问这个类的私有数据成员,我们要理解这个对类的访问限制,而不是针对对象。


    C++的访问控制是类层面的 class-level, 而不是对象级别的object-level,

    同一个类可以访问所有自己类实例的私有成员, 数据成员是类私有而不是实例私有, 成员是否可访问是类的性质, 而不是对象的性质

    展开全文
  • 实践证明,类(class)私有成员可以类成员函数访问,不区分成员在哪个实例(instance)里。 也就是说,在类内部的成员函数中,哪怕是传入的对象,也是可以直接访问对象的私有成员。(前提是该对象必须是本类型的...

    以前对这里确实有点疑惑,但是最近在看其他书的时候突然看到这么一句话:

    实践证明,类(class)私有成员可以被类成员函数访问,不区分成员在哪个实例(instance)里。

    也就是说,在类内部的成员函数中,哪怕是传入的对象,也是可以直接访问该对象的私有成员。(前提是该对象必须是本类型的一个对象)

    这样类对象可以直接访问私有成员就合情合理了,而且这么做也确实是方便的。


    本人新的博客地址  凌风技术站

    展开全文
  • 区分“派生类对象”和“派生”对基类成员的访问权限 ... 区分“派生类对象”和“派生”对基类成员...(1)对于公有继承,只有基类的公有成员可以被“派生类对象访问,其他(保护和私有)成员不能被访问。 (2)对于私...

    区分“派生类对象”和“派生类”对基类成员的访问权限
    文字部分来源:https://blog.csdn.net/weixin_34283445/article/details/90683769

     “派生类对象”对基类成员的访问权限:
    (1)对于公有继承,只有基类的公有成员可以被“派生类对象”访问,其他(保护和私有)成员不能被访问。
    (2)对于私有继承和保护继承,基类中所有成员都不能被“派生类对象”访问。
     “派生类”对基类中成员的访问权限:
    (1)对于公有继承,基类中的公有成员和保护成员可以被“派生类”访问,而基类中的私有成员不能被访问。
    (2)对私有继承和保护继承,也是基类中的公有成员和保护成员可以被“派生类”访问,而基类中的私有成员不能被访问。
    另附一张图片助于理解

    三种继承和三种声明

    展开全文
  • 最近写CPP的时候,需要类外部一个普通函数指针调用类成员函数。根据当初的设计,函数指针所指向的函数不需要传入一个类对象的引用的形参。为了保持最初的设计,在不创建对象的情况下考虑了几种方案: 首先想到的是...
  • C++中对同类对象private成员访问

    千次阅读 2018-10-18 00:23:44
    私有成员变量的概念,在脑海中的现象是,以private关键字声明,是的实现部分,不对外公开,不能在对象外部访问对象的私有成员变量.  然而,在实现拷贝构造函数和赋值符函数时,在函数里利用对象直接访问了私有...
  • 关于类成员函数中访问同类对象的私有成员   原址:http://runfeel.iteye.com/blog/1904768 关于类成员函数中访问同类对象的私有成员,主要包含以下几种场景: a. 在C++的类的...
  • c++中类对象不能访问类的私有成员变量  (2014-06-19 14:13:40) 转载▼ 标签:  股票 分类: C/C _Concept 类的成员变量分三种: public protect private   1、类的...
  • 在派生环境中,基类对象 好像 不能访问 自己的 保护成员
  • 派生内只可能访问基类的...派生类对象和基类对象只能访问自个的public成员 基类成员在继承后在派生中的权限:  基类权限: public private protected  继承权限:public 继承 public private
  • 转自:http://www.cnblogs.com/yanqi0124/p/3828507.html私有成员变量的概念,在脑海中的现象是,以private关键字声明,是的实现部分,不对外公开,不能在对象外部访问对象的私有成员变量. 然而,在实现拷贝构造...
  • 的所有成员函数都可以访问的私有成员,但是静态成员函数没有this指针,因此通过 该对象作为函数参数,可以显示访问的私有成员。 测试程序如下: #include &lt;stdio.h&gt;   class Demo ...
  • (1)对于公有继承,只有基类的公有成员可以被“派生类对象访问,其他(保护和私有)成员不能被访问。 (2)对于私有继承和保护继承,基类中所有成员都不能被“派生类对象访问。  “派生”对基类中成员的访问...
  • 派生中的成员可以访问基类的public成员和protected成员,但不能访问基类的private成员。  派生对象只能访问基类的public成员。  protected(保护继承),private(私有继承)  派生中的成员可以访问基类的...
  • c++ 通过指针来访问类成员

    千次阅读 2018-09-18 20:21:22
    #include&lt;iostream&gt; using namespace std; class Point{ public: Point(int x = 0,int y = 0):x(x),y(y){//构造函数...//访问成员x的接口 } int gety(){return y;//访问成员y的接口 } privat...
  • Java对象访问 的静态变量

    千次阅读 2019-09-22 14:47:30
    Java的静态变量用对象和类名都能访问,一般用类名,但如果用对象访问静态变量呢,有何种效果? 测试一下: package JavaTest; public class test{ public static void main(String[] args) { Horse...
  • C#第3讲:对象的主要成员

    千次阅读 多人点赞 2018-08-13 15:27:59
    c#是一个面向对象的语言,就是对现实世界某个事物的抽象,比如“人”他在程序中就可以用一个来表示,人有年龄(Age),有姓名(Name),人还可以吃饭(Eat)和睡觉(Sleep),根据这几点我们就可以创建一个来...
  • 它们提供级别的访问控制,但是成员函数可以访问同一的所有对象的所有私有成员,例如下面的C++示例: #include "stdafx.h" #include class test { protected: private: int ivalue; public: test()
  • 深入理解Java中为什么内部类可以访问外部成员

    万次阅读 多人点赞 2014-02-26 22:54:26
    内部简介 虽然Java是一门相对比较简单的...其中一个疑惑就是为什么内部类对象可以访问外部类对象中的成员(包括成员变量和成员方法)? 早就想对内部这个特性一探究竟了,今天终于抽出时间把它研究了一下。 内
  • 类中的成员:属性、方法、内部类类成员:使用static修饰的成员 实例成员:没有使用static修饰是成员。类成员只能访问类成员,...(对象其实可以访问类成员,但是底层依然是使用类名访问的)在static方法中,只能调用s
  • 我们首先看一段程序: class A { private : ...这个程序非常的简单,但我们仔细一瞅会发现一个有趣的问题:private的变量i怎么直接可以通过对象访问了!...其他对象的数据成员可以通过引用或指针间接指明)
  • class Student(): school = “xcxy” # 属性 __major = “computer” # 私有属性 def __init__(self ,name, age): # 构造方法 self.name = name # 实例属性 self.__age ...
  • 对象能够直接访问其私有成员变量

    千次阅读 2014-02-21 13:49:57
    私有成员变量的概念,在脑海中的现象是,以private关键字声明,是的实现部分,不对外公开,不能在对象外部访问对象的私有成员变量. 然而,在实现拷贝构造函数和赋值符函数时,在函数里利用对象直接访问了私有成员...
  • 需要先实例化对象,用对象调用 静态只会执行调用一次,并且在程序退出之前会一直保持状态,占领内存 实例化一次调用一次 先执行静态方法 后执行实例方法 二、C#静态和实例 .
  • C++友元函数访问类的私有成员

    千次阅读 2017-09-14 15:23:59
    工程中我们经常需要访问一些成员,添加一个友元函数可以达到我们的目的。#include #include using namespace std ;class Student{ private: string name; int age; int sore; public: Student(string name,
  • 关于java类方法中不能访问实例变量,但实例方法可以访问类变量的一种解释: 类和实例的关系,就像父类和子类的关系,子类是一种特殊的父类。 类是实例的抽象,实例已经具有特殊的含义了,就如动物和狗,狗是动物,但...
  • C++基类成员函数访问派生类对象的基类成员问题,很奇怪的现象,在网上也没有找到相应的说明。 主要是问题太难描述了。 Talk is cheap, show you the code: class Derived; class Base { public: void func...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 638,434
精华内容 255,373
关键字:

对象可以访问类的哪些成员