C++之访问控制(public、private、protected以及friend)

public  所有均可访问
private 类自己的成员函数访问,不能被类对象访问

protected 类自己以及子类访问,不能被类对象访问

friend 友元,别人是你的朋友,他可以访问我的东西。(但不是我可以访问他的东西)

  • 友元关系不能被继承。
  • 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
  • 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明 
  • 友元函数并不是类的成员函数,因此在类外定义的时候不能加上class::function name

例子1 

#include <iostream>

using namespace std;

class A {
private:
	int i;
public:
	A() {i = 0; cout <<"A::A"<<endl; }
	~A() {i = 0; cout <<"A::~A"<<i<<endl; }
	void set(int i) {this->i = i;}
	void g(A *q) { cout << q->i << endl; }
};

int main ()
{
	A a;
	A b;
	b.set(100);
	a.g(&b);   // 使用对象a的成员函数访问对象b中的私有变量i,则不能通过对象直接访问

	return 0;
}

结果



备注:

  • private,protected限制编译时刻检查,而不是运行检查。一直编译成二进制,则不再受到此限制。
  • struct 缺省权限是public, class缺省权限是private
  • C++中,只有成员变量很简单数量少才可能使用struct;一般使用class


例子2-protected

#include <iostream>

using namespace std;


class A {
public:
    int a = 1;
private:
    int b = 2;
protected:
    int c = 3;
};

class B: public A
{
public:
    void func()
    {
        std::cout << A::a << std::endl;    // 可通过A类访问公有变量
//        std::cout << A::b << std::endl;  // 不能在B类中通过A类访问私有变量
        std::cout << A::c << std::endl;    // 可通过A类访问保护变量
    }
};


int main()
{
    B b;
    A a;
    cout << b.a << a.a << endl;   // 可通过A类变量访问共有变量
//    cout << b.c << a.c << endl; // 不可通A过类变量访问保护变量
    return 0;
}


注:

  • 类中省略public 等时,默认是private属性
  • 继承基类, 在基类前省略public 等时, 默认是protected属性



例子3-友元函数,外部调用可访问类的变量和方法

#include <iostream>
#include <math.h>

using namespace std;

class Point
{
public:
	Point(double xx, double yy) { x=xx; y=yy; }  //默认构造函数
	void Getxy();   //公有成员函数
	friend double Distance(Point &a, Point &b);  //友元函数
private:
	double x, y;
        int key = 101;
public:
        int kk = 102;
};

void Point::Getxy()
{
	cout<<key<<endl;  // 函数定义中访问私有变量
}

double Distance(Point &a, Point &b)  // 友元定义,注意函数名前未加类声明符
{
	double dx = a.x - b.x;
	double dy = a.y - b.y;
	return sqrt(dx*dx+dy*dy);
}

int main()
{
	Point p1(3.0, 4.0), p2(6.0, 8.0);
	p1.Getxy();
   
        // cout << p2.key << endl;    不能访问私有变量
        // cout << Point::key << endl;  不能访问非静态变量

        cout << p2.kk << endl;
	double d = Distance(p1, p2);   // 友元访问
	cout<<"Distance is: "<<d<<endl;

	return 0;
}

结果:



例子4-友元类,外部调用可访问类的变量和方法

当一个类作为另一个类的友元时,它的所有成员函数都是另一个类的友元函数,都可以访问另一个类的私有或者公有成员

友元作为参数与使用类指针作为参数的区别在于,友元可以访问类的私有成员


#include <iostream>  
#include <cstring>  
using namespace std ;  
//声明教师类   
class Techer ;  
//学生类   
class Student   
{  
    private:  
        string name ;  
        int age ;     
        char sex ;   
        int score ;   
    public :  
        Student(string name , int age , char sex , int score);  
        void stu_print(Techer &tech);  
};  
//教师类   
class Techer  
{  
    private:  
        string name ;  
        int age ;     
        char sex ;   
        int score ;   
    public :  
        Techer(string name , int age , char sex , int score);  
        //声明一个友元类  
        friend Student ;     
};  
  
//Student类的构造函数的实现   
Student::Student(string name , int age , char sex , int score)  
{  
    this->name = name ;   
    this->age = age ;   
    this->sex = sex ;   
    this->score = score ;  
}  
//Techer类的构造函数的实现  
Techer::Techer(string name , int age , char sex , int score)  
{  
    this->name = name ;   
    this->age = age ;   
    this->sex = sex ;   
    this->score = score ;  
}  
  
//打印Student类中的私有成员和Techer的私有成员   
void Student::stu_print(Techer &tech)  
{  
    //用this指针访问本类的成员   
    cout << this->name << endl ;   
    cout << this->age << endl ;   
    cout << this->sex << endl ;   
    cout << this->score << endl ;  
    //访问Techer类的成员   
    cout << tech.name << endl ;  
    cout << tech.age << endl ;   
    cout << tech.sex << endl ;   
    cout << tech.score << endl ;  
}  
  
int main(void)  
{  
    Student stu1("YYX",24,'N',86);  
    Techer t1("hou",40,'N',99);  
    stu1.stu_print(t1);  
    return 0 ;  
}
结果



备注:

  • 运算符重载经常使用friend
  • friend写在类声明中,一旦类实现完成,则不能再添加friend
  • friend的授权在编译期


  • 7
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您好,私有成员(private member)是指在类中被声明为私有(private访问权限的成员,只能在类的内部访问,外部无法访问。 如果您无法访问一个类中声明的私有成员,可能是因为您正在尝试从类的外部访问该成员。在大多数编程语言中,私有成员只能在类的内部访问,如果您需要从类的外部访问私有成员,可以提供公共接口(public interface)来访问该成员,例如公共成员函数(public member function)或友元函数(friend function)。 希望这能解答您的问题! ### 回答2: c2248因为无法访问private成员通常是因为访问权限控制的原因,private成员是一个类的私有成员,只有该类的成员函数和友元才能访问,其他的程序不能访问。如果c2248无法访问private成员,那么就可能是以下的原因: 1. 没有使用正确的访问方式 在使用private成员时,必须使用正确的方式来访问,否则会出现访问权限不足的错误。例如,在定义了一个私有成员函数时,如果在类的外部直接调用该函数而不是通过该类的公有成员函数来调用,也会出现c2248无法访问private成员的错误。 2. 没有声明该类的友元 friend关键字可以用来声明一个函数或类为该类的友元,从而可以访问该类的private成员。如果没有声明该类的友元,那么外部程序就不能访问该类的private成员,也就会出现c2248无法访问private成员的错误。 3. 使用了非法访问方式 有些程序员可能会试图通过某种非法的方式来访问一个类的private成员,例如在该类之外定义一个同名的函数或者变量,或者使用某个黑客技巧来绕过权限限制。这种非法访问方式会被编译器拒绝,并提示c2248无法访问private成员的错误。 总之,c2248无法访问private成员通常是因为访问权限的限制。如果你想要访问一个类的private成员,就必须使用正确的访问方式,并声明该类的友元。同时,也要警惕那些试图使用非法访问方式来获取private成员的程序,以免造成安全隐患。 ### 回答3: c2248是C++编译器常见的错误代码,它表明程序中的某个部分尝试访问一个类的私有成员。一个类的私有成员只能在类的内部访问,无法从外部对象或函数访问。 通常情况下,程序员尝试直接访问一个类的私有成员,或将类的私有成员传递到另一个函数或对象中,这通常会导致c2248错误的出现。可以通过在类的公有接口中定义公有成员函数来解决这个问题,这一点可以通过在类的定义中增加public关键字来实现。 另一种解决方法是将相应的成员函数或变量更改为protected或公有。protected成员允许类的派生类进行访问,而公有成员则可以在类的外部进行访问。 在解决c2248错误时,开发者还需要仔细检查程序中所引用的类或对象,以确保它们具有访问相应成员的权限。如果程序中使用了类的指针,必须先初始化指针并在指针上调用成员函数,才能访问私有成员。 总之,c2248错误提示程序尝试访问类的私有成员,只能通过公有接口进行访问。所以,解决方法包括更改私有成员的访问级别、定义公有成员函数或更改类的派生关系等。需谨慎操作,确保修改不会影响程序的正确性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值