CPP 核心编程3-类和对象

#include "iostream"

using namespace std;
const double PI = 3.14;

class Circle {
public:
    double m_r;

    double calculateZC() {
        return 2 * PI * m_r;
    }
};

int main() {
    Circle c;
    c.m_r = 10;
    double zc = c.calculateZC();
    cout << "周长=" << zc << endl;
    return 0;
}
周长=62.8
#include "iostream"

using namespace std;

class Student {
public:
    int m_id;
    string m_name;

    void show() {
        cout << "学号:" << m_id << " 姓名:" << m_name << endl;
    }
};

int main() {
    Student s;
    s.m_id = 10;
    s.m_name = "真是";
    s.show();
    return 0;
}

 

#include "iostream"

using namespace std;

//常函数
class Person {
public:
    //this指针的本质是 指针常量  指针的指向是不能改的  相当于Person * const this
    //如果想限定this指针指向的值也不能修改,就得类似于 const Person * const this,此时这个const加在哪里呢?最终决定加在函数()后面
    //在成员函数后面加const,修饰的是this指向,让指针指向的值也不可以修改
    void showPerson() const {
//        this = NULL;//加不加const,this指针是不可以修改指针的指向的
//        m_A = 100;//加了const就不能修改指针指向的值
        cout << m_A << endl;
    }

    int m_A;

    void showNormal() {

    }
};

//常函数
class Person2 {
public:
    //this指针的本质是 指针常量  指针的指向是不能改的  相当于Person * const this
    //如果想限定this指针指向的值也不能修改,就得类似于 const Person * const this,此时这个const加在哪里呢?最终决定加在函数()后面
    //在成员函数后面加const,修饰的是this指向,让指针指向的值也不可以修改
    void showPerson() const {
//        this = NULL;//加不加const,this指针是不可以修改指针的指向的
//        m_A = 100;//加了const就不能修改指针指向的值
        m_B = 100;//或this->m_B=100;
        cout << m_B << endl;
    }

    void showNormal() {

    }

    int m_A;
    mutable int m_B;//特殊变量,即使在常函数中,也可以修改这个值,加关键字mutable
};

void test1() {
    Person p;
    p.showPerson();// 0
    p.showNormal();//不报错
    Person2 p2;
    p2.showPerson();// 100
    p2.showNormal();//不报错
}

//常对象
//常对象只能调常函数,不可以调用普通成员函数,因为普通成员函数是可以修改属性的。
// 可以这么理解,如果普通函数里面修改m_A,如 m_A=100,那么如果能调用普通函数就会修改m_A,所以不允许
void test2() {
//    const Person p;//视频里是这样的,不报错。新版的报错, 'const class Person' has no user-provided default constructor
    const Person p{};//新版得这样声明 可以发现test1中不报(但是有warning),但是加了const就报错。
//    p.m_A = 100;//报错
//    p.showNormal();//报错

    const Person2 p2{};
//    p2.m_A = 100;//报错
    p2.m_B = 100;//不报错
//    p2.showNormal();//报错
}

int main() {
//    test1();
    test2();
    return 0;
}

全局函数作友元

下面代码是不能访问private属性的

#include "iostream"

using namespace std;

class Building {
public:
    Building() {
        m_SittingRoom = "客厅";
        m_BedRoom = "卧室";
    }

    string m_SittingRoom;
private:
    string m_BedRoom;

};

//全局函数
void goodGay(Building *building) {
    cout << "好基友全局函数 正在访问:" << building->m_SittingRoom << endl;//可以访问
//    cout << "好基友全局函数 正在访问:" << building->m_BedRoom << endl;//报错
}

void test1() {
    Building building;
    goodGay(&building);
}

int main() {
    test1();
    return 0;
}

修改下,如下

#include "iostream"

using namespace std;

class Building {
    //告诉编译器 goodGay全局函数是Building的好朋友,可以访问Building中私有成员
    friend void goodGay(Building *building);

public:
    Building() {
        m_SittingRoom = "客厅";
        m_BedRoom = "卧室";
    }

    string m_SittingRoom;
private:
    string m_BedRoom;

};

//全局函数
void goodGay(Building *building) {
    cout << "好基友全局函数 正在访问:" << building->m_SittingRoom << endl;//可以访问
    cout << "好基友全局函数 正在访问:" << building->m_BedRoom << endl;//报错
}

void test1() {
    Building building;
    goodGay(&building);
}

int main() {
    test1();
    return 0;
}
好基友全局函数 正在访问:客厅
好基友全局函数 正在访问:卧室

类作友元

下面代码用到了类外实现,以前一般都是类内实现,这里用下类外实现。

下面代码不能访问私有变量

#include "iostream"

using namespace std;

//类作友元
class Building;//告诉编译器有一个Building类,暂时没定义,不要给我报错

class GoodGay {
public:
    GoodGay();

    void visit();//参观函数 访问Building中的属性 ,这里就声明下,准备用类外实现

    Building *building;
};

class Building {
public:
    Building();

    string m_SittingRoom;
private:
    string m_BedRoom;
};

//类外写成员函数
GoodGay::GoodGay() {
    building = new Building;//在堆区创建一个对象
}

void GoodGay::visit() {
    cout << "好基友这个类正在访问:" << building->m_SittingRoom << endl;
//    cout << "好基友这个类正在访问:" << building->m_BedRoom << endl;//不能访问私有变量

}

Building::Building() {
    m_SittingRoom = "客厅";
    m_BedRoom = "卧室";
}

void test1() {
    GoodGay gg;
    gg.visit();
}

int main() {
    test1();
    return 0;
}

加上 friend class GoodGay;

修改后

#include "iostream"

using namespace std;

//类作友元
class Building;//告诉编译器有一个Building类,暂时没定义,不要给我报错

class GoodGay {
public:
    GoodGay();

    void visit();//参观函数 访问Building中的属性 ,这里就声明下,准备用类外实现

    Building *building;
};

class Building {
    friend class GoodGay;

public:
    Building();

    string m_SittingRoom;
private:
    string m_BedRoom;
};

//类外写成员函数
GoodGay::GoodGay() {
    building = new Building;//在堆区创建一个对象
}

void GoodGay::visit() {
    cout << "好基友这个类正在访问:" << building->m_SittingRoom << endl;
    cout << "好基友这个类正在访问:" << building->m_BedRoom << endl;

}

Building::Building() {
    m_SittingRoom = "客厅";
    m_BedRoom = "卧室";
}

void test1() {
    GoodGay gg;
    gg.visit();
}

int main() {
    test1();
    return 0;
}
好基友这个类正在访问:客厅
好基友这个类正在访问:卧室

成员函数作友元

#include "iostream"

using namespace std;

//成员函数作友元
class Building;

class GoodGay {
public:
    GoodGay();//锻炼下类外实现

    void visit();//让visit可以访问Building中私有成员

    void visit2();//让visit2不可以访问Building中私有成员
    Building *building;
};

class Building {
    friend void GoodGay::visit();

public:
    Building();//锻炼下类外实现

    string m_SittingRoom;
private:
    string m_BedRoom;

};
//类外实现成员函数

Building::Building() {
    m_SittingRoom = "客厅";
    m_BedRoom = "卧室";
}

GoodGay::GoodGay() {
    building = new Building;
}

void GoodGay::visit() {
    cout << "visit正在访问" << building->m_SittingRoom << endl;
    cout << "visit正在访问" << building->m_BedRoom << endl;
}

void GoodGay::visit2() {
    cout << "visit2正在访问" << building->m_SittingRoom << endl;
//    cout << "visit2正在访问" << building->m_BedRoom << endl;//报错
}

void test1() {
    GoodGay gg;
    gg.visit();
    gg.visit2();
}

int main() {

    test1();
    return 0;
}
visit正在访问客厅
visit正在访问卧室
visit2正在访问客厅

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值