C++ 的一个问题的理解(私有变量成员)

class CExample
{
public:
    CExample(){pBuffer=NULL; nSize=0;}
    ~CExample(){delete pBuffer;}
    CExample(const CExample&);
void Init(int n){ pBuffer=new char[n]; nSize=n;}
private:
    char *pBuffer;
    int nSize;
};
CExample::CExample(const CExample& RightSides)
{
    nSize=RightSides.nSize; //!!!!!!请注意这句话!!!!!!
    pBuffer=new char[nSize];
    memcpy(pBuffer,RightSides.pBuffer,nSize*sizeof(char));
}

感叹号部分我很奇怪,不是不允许对象许访问私有变量成员么?怎么回事,而且还能编译通过。

1.为什么对象a可以直接访问私有的x(a.x)成员见http://topic.csdn.net/u/20110504/22/738aede9-3909-4d74-82fd-8d4a2f2f12a5.html

给出了一个解答:因为A(const A&a)是他的成员函数。

在我的例子也是如此:CExample::CExample(const CExample& RightSides)是CExample的成员函数,所以可以访问同类型对象的私有成员。即RighSides.nSize的调用可以编译用过,但是,你在main函数里面直接写上:

int main(int argc, char* argv[])
{
CExample theObjone;
theObjone.nSize;
return 0;
}

编译器肯定是报错,提示你nSize是私有变量,不允许对象进行访问。
随后,我又做了一个实验:

#include <iostream>

using namespace std;
class T{
private:
    int m_data;
};
class CTest
{
public:
 CTest();  //构造函数
 CTest(const CTest &); //复制构造函数
 CTest & operator = (const CTest &); //赋值符
 void print(){
     cout << m_data << endl;
 };
int print1(const CTest &);
int print2(const T&);
private:
 int m_data;
};

CTest::CTest()
{
 cout<<"Constructor of CTest"<<endl;
}

CTest::CTest(const CTest& arg)
{
    cout << arg.m_data <<endl;
    cout<<"Copy Constructor of CTest"<<endl;
}

CTest & CTest::operator = (const CTest & arg)
{
 cout<<"Assign function of CTest"<<endl;
}
int CTest :: print1(const CTest & arg){
    cout << arg.m_data <<endl;
    return 0;
}
int CTest::print2(const T& arg){
    cout << arg.m_data << endl;
}
int main()
{
 CTest a;
 return 0;
}

请注意print()、print1()、print2()的区别;

print()自然不用说,成员函数访问类的私有变量,编译通过;

print1():print1是CTest类的成员函数,而print1的形参是const CTest& arg,arg的类型就是CTest,根据成员函数可以访问私有变量,故编译通过

print2():print2是CTest类的成员函数,但是print2的形参类型是T,不是CTest,print2不是T的成员函数,不能访问类的私有变量,故编译不能通过

转自:http://blog.csdn.net/randyjiawenjie/article/details/6667146

时间: 2024-10-27 13:56:31

C++ 的一个问题的理解(私有变量成员)的相关文章

编写一个矩形类,私有数据成员为矩形的长( len)和宽(wid),wid设置为0,有参构造函数设置和的值,另外,类还包括矩形的周长、求面积、取矩形的长度、取矩形的长度、取矩形的宽度、修改矩形的长度和宽度为对应的形参值等公用方法。

class Rectangle { private double len, wid; public Rectangle()//求矩形周长 { len = 0; wid = 0; } public Rectangle(int l, int w)//求矩形面积 { len = l; wid = w; } public double perimeter()//求周长 { return ((len + wid) * 2); } public double area()//求面积 { return (le

继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类。 (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。 (3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承。 (4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。 分析以上程

继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类. (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法.(3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承.(4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承. 分析以上程序示例,主要疑惑点是“子类继承父类的成员变量,父类对象是否会实例化?私有成员变量是否会被继承?被继承的成员变量

单例下并发的情况下访问私有变量的一个典型问题

一个小问题,单例下 并发的情况下访问私有变量的典型问题,以下是一个小Demo public class dssd { static void Main(string[] args) { var t = Task.Factory.StartNew(() => { Thread.Sleep(1000); var obj2 = ImportProvider.Instance; Arg ds = new Arg() { TypeSS = 2 }; obj2.Import(ds); }); var obj

ut一个私有变量的学习

<html> <body background="../picture/bg_body.gif"></body> <pre> public class PmMmlExport { private DebugPrn logger = new DebugPrn(PmMmlExport.class.getName()); private boolean mmlAsyn; private ExportUtil exportUtil = new E

JS中的 公有变量、私有变量 !

公有变量.私有变量 ! 初学者的见解,算是记录学习过程,也算是分享以便共同成长,如有不正确的地方,还请不吝赐教! 先看代码1: function car(){ var wheel = 3; //私有变量 this.wheel = 4; //公有变量 alert(wheel); alert(this.wheel); } var car1 = new car();结果是:3 4 代码2: function car(){ var wheel = 3;//私有变量 this.wheel = 4;//公有

在拷贝构造函数中为什么可以访问引用对象的私有变量? [问题点数:0分]

在拷贝构造函数中为什么可以访问引用对象的私有变量? 例如: class Point { public:         Point(int xx=0,int yy=0){X=xx;Y=yy;}         Point(Point &p); private:         int X,Y; }; Point::Point(Point &p) {         X=p.X;         Y=p.Y; } 更多 0 分享到: 相关主题推荐: 对象 class yy x 相关帖子推荐:

两种创建私有变量、私有方法的方法

在构造函数中定义特权方法: 利用函数的块级作用域,然后在里面创建了两个特权方法,两个特权方法作为构造函数的闭包可以访问到私有变量name,所以创建构造函数的实例之后只能通过这两个特权方法访问到name这个私有变量(并且每个实例的name不是同一个) 在私有作用域中创建构造函数 首先创建了一个私有作用域,然后在里面创建了一个构造函数,不是用声明式而是用函数表达式创建了一个私有作用域的闭包,这样Person就是一个全局变量,然后通过原型创建了两个特殊方法,然后私有变量name就只能通过这两个方法访问

四.OC基础--1.文档安装和方法重载,2.self和super&amp;static,3.继承和派生,4.实例变量修饰符 ,5.私有变量&amp;私有方法,6.description方法

四.OC基础--1.文档安装和方法重载, 1. 在线安装 xcode-> 系统偏好设置->DownLoads->Doucument->下载 2. 离线安装 百度xcode文档 3. 方法重载: 是指在一个类中定义多个同名的方法 在OC中没有重载 2.self和super&static, self和super: 1. self理解: 谁调用当前方法, self就代表谁. 比如: 在对象方法中,self代表的是对象, 因为只有对象才可以调用对象方法 在类方法中, self代表的

7.4 私有变量

严格来讲,JavaScript并没有什么私有变量的概念,但是从作用域的角度来看,一个是全局,函数: 在函数中定义的变量都可以称之为 私有变量:因为不能在函数外部访问: 1 function add(num1,num2){ 2 var sum = num1 + num2; 3 return sum; 4 } 上面代码完成两个数字累加,函数内部声明三个私有变量,num1, num2, sum. 在函数内部可以访问这几个变量,但函数外部则不能访问它们. 如果在这个函数内部创建一个闭包,那么闭包通过自己