【C++】4.一些特殊情况(下)


4.3 const成员

  1. 在 C++类中声明对象成员时加上const关键字
  2. 常量成员分为常量数据成员常量函数成员

常量数据成员

使用成员初始化列表,对非静态成员进行一个初始化。

class ClassName {
public:
    ClassName();
    ClassName(int v);
    ClassName(int v,int num);
    ~ClassName();
    
    int num;
    const int val;//定义一个常量数据成员
};
//说的是下面3个
ClassName::ClassName() :val(0) {}
ClassName::ClassName(int v) :val(v) {}
ClassName::ClassName(int v, int num) :val(v), num(num) {}

ClassName::~ClassName() {}

int main() {
    ClassName obj_1;
    cout << "obj_1.val = " << obj_1.val << endl;

    ClassName obj_2;
    cout << "obj_2.val = " << obj_2.val << endl;

    ClassName obj_3(6);
    cout << "obj_3.val = " << obj_3.val << endl;

    return 0;
}

常量函数成员

class ClassName {
public:
    ClassName();
    ClassName(int v);
    ClassName(int v,int num);
    ~ClassName();
    
    int num;
    const int val;//定义一个常量数据成员
    static int n;

    void test_Func_1() {
        cout << "test_Func_1()" << endl;
        cout << "val = " << val << endl;
        cout << "num = " << num << endl;
    }
    void test_Func_2() const{           //加一个const就是常量成员函数了
        cout << "test_Func_2()" << endl;
        cout << "val = " << val << endl;
        cout << "num = " << num << endl;
        //在常量成员函数里面是不能对当前这个类的任何普通的数据成员进行修改的。
        n = 10;//这个属于静态成员,静态成员是可以改的。
        this->n = 99;//这个n也可以用this访问到。这两行是唯一的特例。
    }
    void test_Func_3() const;
};
int ClassName::n = 0;

ClassName::ClassName() :val(0) {}
ClassName::ClassName(int v) :val(v) {}
ClassName::ClassName(int v, int num) :val(v), num(num) {}
void ClassName::test_Func_3() const {//类的外面去实现一个const函数的时候,这个const不能丢掉。
    cout << "test_Func_2()" << endl;
    cout << "val = " << val << endl;
    cout << "num = " << num << endl;
}

ClassName::~ClassName() {}

int main() {
    ClassName obj_1;
    cout << "obj_1.val = " << obj_1.val << endl;

    ClassName obj_2;
    cout << "obj_2.val = " << obj_2.val << endl;

    ClassName obj_3(6);
    cout << "obj_3.val = " << obj_3.val << endl;

    ClassName obj_4(9,8);
    obj_4.test_Func_1();
    obj_4.test_Func_2();

    return 0;
}
class ClassName {
public:
    ClassName();
    ClassName(int v);
    ClassName(int v,int num);
    ~ClassName();
    
    int num;
    const int val;//定义一个常量数据成员
    static int n;

    void test_Func_1() {
        cout << "test_Func_1()" << endl;
        cout << "val = " << val << endl;
        cout << "num = " << num << endl;
    }
    void test_Func_2() const{//加一个const就是常成员函数了
        cout << "test_Func_2()" << endl;
        cout << "val = " << val << endl;
        cout << "num = " << num << endl;
        //在常量成员函数里面是不能对当前这个类的任何普通的数据成员进行修改的。
        n = 10;//这个属于静态成员,静态成员是可以改的。
        this->n = 99;//这个n也可以用this访问到。这两行是唯一的特例。
    }
    void test_Func_3() const;
};
int ClassName::n = 0;

ClassName::ClassName() :val(0) {}
ClassName::ClassName(int v) :val(v) {}
ClassName::ClassName(int v, int num) :val(v), num(num) {}
void ClassName::test_Func_3() const {//类的外面去实现一个const函数的时候,这个const不能丢掉。
    cout << "test_Func_2()" << endl;
    cout << "val = " << val << endl;
    cout << "num = " << num << endl;
}

ClassName::~ClassName() {}

int main() {
    ClassName obj_1;
    cout << "obj_1.val = " << obj_1.val << endl;

    ClassName obj_2;
    cout << "obj_2.val = " << obj_2.val << endl;

    ClassName obj_3(6);
    cout << "obj_3.val = " << obj_3.val << endl;

    ClassName obj_4(9,8);
    obj_4.test_Func_1();
    obj_4.test_Func_2();

    const ClassName obj_5(3, 4);
    //obj_5.num = 0;改不了,常量对象的任何成员你都改不了
    obj_5.n = 0;//这个是静态的,就不受这个影响。
    //obj_5.test_Func_1();不能调用。常量对象不能调用普通成员函数。
    obj_5.test_Func_2();//可以调用常量成员函数,并且所有的数据成员都不能通过常量对象本身进行修改。

    ClassName const obj_6(3, 4);//和上面那个差不多

    return 0;
}

4.4 友元关系

  1. 类的特性之一是封装,友元是打破封装的手段。
  2. 友元分为友元函数和友元类
  3. 友元类可以创建友元对象

在这里插入图片描述

把A看成一个类,A的里面藏起来了,看不清,F是一个函数。

A觉得F很顺眼,想交一个朋友,F就是A的友元函数。

B是一个类。A把B当成了朋友。B就是A的友元类。

A喜欢BF。但是BF不一定喜欢A。友元不是对等的。


友元函数

class A {
    int num;
    friend void test_Func_1(A obj);         //就这行
public:
    A() { num = 0; }
};

void test_Func_1(A obj) {
    obj.num = 0;
}

int main() {
    A a;
    test_Func_1(a);
    return 0;
}

友元类

class A {
    int num;//创建的默认是私有的
    friend class B;//B能访问A里面私有的,A里面看不到B里面私有的
};
class B {
public:
    void testFunc(A obj) {
        obj.num;
    }
};

int main() {
    
    return 0;
}class A {
    int num;//创建的默认是私有的
    friend class B;//B能访问A里面私有的,A里面看不到B里面私有的
};
class B {
public:
    void testFunc(A obj) {
        obj.num;
    }
};

int main() {
    
    return 0;
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值