2021-10-16 C++学习

数据共享和保护

这个代码是写静态成员以及静态成员函数的

#include <iostream> 
using namespace std; 
class A { 
        int i,j; 
        static int c; 
    public: 
         A(int a=0,int b=0) { i=a; j=b; c++; } //静态成员可以在类中直接访问
        ~A() { c--; } 
        static void f() { cout<<"c="<<c<<endl; } 
        /*
        刚才试验了一下如果写的是
        static void f() { cout<<"i="<<i<<endl; }
        会编译错误,就是说静态成员函数只能访问静态成员
        想一想这个很对,因为不同对象只有静态成员始终一样啊,其他私有成员肯定不行
        */
}; 
int A::c=0; 
int main() { 
    A a(4,8),b,d;
    a.f();//静态成员函数,可以通过对象访问,格式为(对象.成员)
    { 
        A z(3,6), f; 
        A::f(); //也可以使用类名访问静态成员函数
    } 
    A::f(); 
    return 0;
}

已知f1和f2是同一个类的两个成员函数,但f1不能调用f2,下列选项中符合要求的是(        )。
A、f1和f2都是静态函数
B、f1和f2都不是静态函数
C、f1是静态函数,f2不是静态函数
D、f1不是静态函数,f2是静态函数

ans:C

静态数据成员需要使用静态成员函数访问,普通成员函数可以调用静态成员函数以便操作静态成员,静态成员函数不能调用普通成员函数,普通成员函数也可以访问静态成员。不过普通成员函数得通过对象访问函数,不能像静态成员函数那样用`类名::静态函数名`来访问


友元

友元函数:
有时候我们需要一个类外定义的函数能够访问类中的private和protected函数,那么就使用友元函数,注意友元函数并不是属于任何一个类的成员函数。

#include <iostream>
 
using namespace std;
 
class Box
{
   double width;
public:
   friend void printWidth( Box box );
   //声明一下这个函数是该类的友元函数,就可以从外面访问类中的私有和保护成成员
   void setWidth( double wid );
};
 
// 成员函数定义
void Box::setWidth( double wid )
{
    width = wid;
}
 
// 请注意:printWidth() 不是任何类的成员函数
void printWidth( Box box )
{
   /* 因为 printWidth() 是 Box 的友元,它可以直接访问该类的任何成员 */
   cout << "Width of box : " << box.width <<endl;
}
 
// 程序的主函数
int main( )
{
   Box box;
 
   // 使用成员函数设置宽度
   box.setWidth(10.0);
   
   // 使用友元函数输出宽度
   printWidth( box );
 
   return 0;
}

友元类
注意友元的关系是单向的,这个和人类之前的朋友关系不同
仔细体会下面的代码

#include<iostream>
using namespace std;


class CCar
{
private:
    int price=0;
    friend class CDriver;  //声明 CDriver 为友元类
public:
	void p(){
		cout<<price;
	}
};
class CDriver
{
public:
    CCar myCar;
    void ModifyCar()  //改装汽车
    {
        myCar.price += 1000;  //因CDriver是CCar的友元类,故此处可以访问其私有成员
    }
};
int main()
{
	CCar a;
	CDriver b;
	b.ModifyCar();
	b.myCar.p();
    return 0;
}

四/数据的保护

主要利用const,这个等期末复习时候更新

  • 常数据成员必须被初始化,并且不能被更新
class A{
publie:
    A(){data=0;}
    ~A(){}
    int GetData ( ) const { return data;}
    void SetData(int n) {data=n;}
private:
    int data;
};
const A a;
A b;
下列函数调用中错误的是(        )。
A. a.GetData();
B. a.SetData(10);
C. b.GetData();
D. b.SetData(10);
我的答案: B正确答案: B
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值