《C++程序设计POJ》《WEEK3 类和对象进阶》成员对象和封闭类/友元/this指针/常量成员函数

// 构造函数赋值

CTyre(int r, int w):radius(r), width(w) { }

初始化列表

复制代码
#include<iostream>
using namespace std;
/*成员对象和封闭类
成员对象: 一个类的成员变量是另一个类的对象
包含 成员对象 的类叫 封闭类 (Enclosing)
*/
class CTyre
{
private:
    int radius;
    int width;
public:
    CTyre(int r, int w) :radius(r), width(w) {} //初始化列表
};

class CEngine
{

};

class CCar
{
private:
    int price;
    CTyre tyre;
    CEngine engine;
public:
    CCar(int p, int tr, int tw);
};

CCar::CCar(int p, int tr, int w) :price(p), tyre(tr, w) {}

int main()
{
    CCar car(20000, 17, 225);
    return 0;
}
View Code
复制代码

友元

复制代码
#include<iostream>

class CCar; //提前声明 CCar类, 以便后面CDriver类使用
class CDriver
{
public:
    void ModifyCar(CCar * pCar); //改装汽车

};

class CCar
{
private:
    int price;
    friend int MostExpensiveCar(CCar cars[], int total); //声明友元
    friend void CDriver::ModifyCar(CCar* pCar); //声明友元
};

void CDriver::ModifyCar(CCar *pCar)
{
    pCar->price += 1000; //汽车改装后价值增加

}

int MostExpensiveCar(CCar cars[], int total) //求最贵汽车的价格
{
    int tmpMax = -1;
    for (int i = 0; i < total; ++i)
        if (cars[i].price > tmpMax)
            tmpMax = cars[i].price;
    return tmpMax;
}
int main()
{
    return 0;
}
View Code
复制代码

Note:
友元类之间的关系
不能传递, 不能继承

A 是 B的友元,B 是 C的友元, 不能推出A与C的友元关系。

 

this指针

C语言的结构体不能定义成员函数!!!

C++可以

 

 

常量成员函数
在类的成员函数说明后面可以加const关键字,则该成员函数成为常量成员函数。
常量成员函数执行期间不应修改其所作用的对象。因此,在常量成员函数中不能修改成员变量的值(静态成员变量除外),也不能调用同类的非常量成员函数(静态成员函数除外)

 

常量成员函数的重载

两个成员函数,名字和参数表都一样,但是一个是const,一个不是,算重载。

复制代码
#include<iostream>
using namespace std;

class CTest
{
private:
    int n;
public:
    CTest() { n = 1; } // constructor function
    int GetValue() const { return n; }
    int GetValue() { return 2 * n; }
};

int main()
{
    const CTest objTest1;
    CTest objTest2;
    cout << objTest1.GetValue() << "," << objTest2.GetValue();
    while (1);
    {

    }
}
View Code
复制代码

 

常引用

引用前面可以加const关键字,成为常引用。
不能通过常引用,修改其引用的变量

 

可以用对象的常引用作为参数,如:
class Sample {

};
void PrintfObj( const Sample & o)
{
……
}
这样函数中就能确保不会出现无意中更改o值的语句了。

复制构造函数起作用的三种情况

 

1. 当用一个对象去初始化同类的另一个对象时。
Complex c2(c1);
Complex c2;  //初始化语句,非赋值语句

 

2. 如果某函数有一个参数是类 A 的对象,
那么该函数被调用时,类A的复制构造函数将被调用

3. 如果函数的返回值是类A的对象时,则函数返回时,
A的复制构造函数被调用:

posted @   清风oo  阅读(238)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示