C++访问类的私有成员变量的方法(友元函数、友元类)

简介: C++访问类的私有成员变量的方法(友元函数、友元类)

// win32Test.cpp : Defines the entry point for the console application.

//


#include "stdafx.h"


class A

{

public:

A(){;}

~A(){;}


public:

int fun(A& one)

{

 //表达式1:错误

 //return one.fun(this);

 //表达式2:错误,cannot convert parameter 1 from 'class A *const ' to 'class A &'

 //m_iX = fun(this);

 //return m_iX;

 //表达式3:正确

 int* const pX = &one.m_iX;

}


private:

int m_iX;

//const B& b1;//正确,可以这样声明,类的成员变量可以是常引用,但是在构造函数必须初始化

//B& b2;//正确,可以这样声明,类的成员变量可以是常引用,但是在构造函数必须初始化

};


class B

{

public:

B();

~B();

public:

int Get(B& b)

{

 return b.m_iY;//正确,类的内部可以直接访问私有变量

}


int Get()

{

 return m_pOne->m_iY;//正确,类的内部可以直接访问私有变量

}


public:

friend int global_getB(B& b);//定义成友元函数


private:

int m_iY;

B* m_pOne;

};


int global_getB(B& b)//全局函数

{

return b.m_iY;//正确,友元函数可以直接访问私有变量

}


class C

{

private:

C(){}

~C(){}


public:

friend class D;

};


class D

{

public:

D(){}

~D(){}


public:

C* GenFun()

{

 return new C();//可以通过友元类的方式创建对象C

}

};


//C++访问类的私有成员变量的方法:

//方法1:set/get接口

class E

{

int i;


public:

E()

{

 i = 50;

}

int get() const {return i;}

void set(int k) {i = k;}

};


//方法2:友元类

class F

{

int i;


public:

F()

{

 i = 50;

}

friend class G;

};


class G

{

public:

F f;

int get()

{

 return f.i;

}

};


//方法3:友元函数

class H

{

int i;


public:

friend int global_getH(H& h);

};


int global_getH(H& h)

{

return h.i;

}


int main(int argc, char* argv[])

{

//B& b3;//错误,不可以这样定义,必须初始化

//C c;//错误,类c的构造函数是私有的,必须通过静态函数或者友元的方法来实例化对象

return 0;

}



两道问答题:


//在声明类中的构造函数、析构函数、纯虚函数、静态成员函数、非静态的成员函数以及全局函数作为类的友元函数时,哪些可以是常量成员函数?

//只有纯虚函数、非静态的成员函数可以是常量成员函数。

//(这题有点问题,析构函数可以是纯虚函数,但不能是常量函数)

//1、声明带有 const 关键字的成员函数指定,函数是 “只读”函数,在它被调用的时候不会修改对象。一个常数成员函数不能修改任何非静态数据成员或调用不是常数的任何成员函数。

//若要声明常数成员函数,请在参数列表的右括号后放置const关键字。声明和定义中均要求该const关键字。

//2、构造函数和析构函数为了生成和释放成员变量,显然不能是const。

//3、静态成员函数不能是常量成员函数的原因:

//(1)const成员函数是包含this指针的。这明显不被static函数允许。

//(2)因为static成员不是任何对象的组成部分,所以static成员不能被声明为const,毕竟将成员声明为const就是承诺不会修改该函数所属对象。

//(3)const针对对象才有意义。const是基于对象的;static 是基于类的。

//4、全局函数作为类的友元函数时,它是定义在类外的普通函数,并不属于类的成员函数。



//通常类A的拷贝构造函数的原型写为A(const A&);,请问为什么参数一定要使用引用形式?使用const修饰符除了可以防止修改传递给构造函数的实参外,还有什么作用?

//A(const A& one ).当调用此拷贝构造函数时,需将参数压栈,若不使用&,就需要在栈内创建一个one的副本,而这需要用拷贝构造函数。这样就会形成递归调用。

//使用const,还允许用一个常量对象作为样本,来构造一个新的对象。


相关文章
|
1月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
75 4
|
2月前
|
Java 编译器 C++
c++学习,和友元函数
本文讨论了C++中的友元函数、继承规则、运算符重载以及内存管理的重要性,并提到了指针在C++中的强大功能和使用时需要注意的问题。
25 1
|
3月前
|
编译器 API C语言
超级好用的C++实用库之跨平台实用方法
超级好用的C++实用库之跨平台实用方法
42 6
|
2月前
|
C语言 C++
实现两个变量值的互换[C语言和C++的区别]
实现两个变量值的互换[C语言和C++的区别]
24 0
|
4月前
|
存储 安全 C++
C++:指针引用普通变量适用场景
指针和引用都是C++提供的强大工具,它们在不同的场景下发挥着不可或缺的作用。了解两者的特点及适用场景,可以帮助开发者编写出更加高效、可读性更强的代码。在实际开发中,合理选择使用指针或引用是提高编程技巧的关键。
37 1
|
3月前
|
JavaScript 前端开发 Java
通过Gtest访问C++静态、私有、保护变量和方法
通过Gtest访问C++静态、私有、保护变量和方法
91 0
|
4月前
|
C++
C++ 避免多重定义的方法
C++ 避免多重定义的方法
64 0
|
4月前
|
Dart API C语言
Dart ffi 使用问题之想在C/C++中创建异步线程来调用Dart方法,如何操作
Dart ffi 使用问题之想在C/C++中创建异步线程来调用Dart方法,如何操作
|
5月前
|
C++
C++友元函数和友元类的使用
C++中的友元(friend)是一种机制,允许类或函数访问其他类的私有成员,以实现数据共享或特殊功能。友元分为两类:类友元和函数友元。类友元允许一个类访问另一个类的私有数据,而函数友元是非成员函数,可以直接访问类的私有成员。虽然提供了便利,但友元破坏了封装性,应谨慎使用。
|
19天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
29 2