《新标准C++程序设计》2.4-2.6(C++学习笔记4)

 1、对象的内存匹配

一般来说,在C++中,一个对象占用的内存空间大小等于其成员变量所占用的内存空间的大小之和。(对象只包含成员变量,不包含成员函数)

每个对象都有各自的存储空间。一个对象的某个成员变量被改变后,不会影响另一个对象。

2、类的成员变量和成员函数使用方法

①对象名.成员名

②指针->成员名

③引用名.成员名

3、类成员的可访问范围

private:用来指定私有成员。只在该类的成员函数内部才能被访问。

public:用来指定公有成员。在任何地方都可以被访问。

protected:用来指定保护成员。

三种关键字出现的次数和先后次序都没有限制。

如果某个成员前面没有访问范围说明符,则对class来说,该成员默认的被认为是私有成员;对struct来说,该成员默认的被认为是公有成员。

在类的成员函数内部,能够访问:当前对象的全部属性、函数;同类其它对象的全部属性、函数在该类的成员函数以外的地方,只能够访问该类对象的公有成员。

4、隐藏

设置私有成员的机制叫作隐藏。它的一个目的就是强制对成员变量的访问一定要通过成员函数进行。这样的好处是,如果修改了成员变量的类型等属性,只需要更改成员函数即可;否则,所有直接访问成员变量的语句都需要修改。

5、成员函数的重载及参数缺省

成员函数可以重载,可以带缺省参数。使用缺省参数要注意避免有函数重载时的二义

6、示例程序剖析

(1)

#include<iostream>
using namespace std;
class CRectangle
{
public:
    int w, h;                   //成员变量,宽度和高度
    void init(int w_, int h_); //成员函数,设置宽度和高度
    int area();                //成员函数,求面积
    int perimeter();           //成员函数,求周长
};                             //必须有分号
viod CRectangle::Init(int w_, int h_)
{
    w = w_;
    h = h_;
}
int CRectangle::area()
{
    return w * h;
}
int CRectangle::perimeter()
{
    return 2 * (w + h);
}
int main()
{
    int w, h;
    CRectangle r;               //r是一个对象
    cin >> w >> h;
    r.init(w, h);              //调用成员函数,作用于r
    cout << "It`s area is " << r.area() << endl;
    cout << "It`s perimeter is " << r.perimeter();
    cout << sizeof(CRectangle) << endl;
    return 0;
}

(2)

#include<iostream>
#include<cstring>
using namespace std;
class CEmployee {
private:
    char szName[30];                     //名字
public:
    int salary;                          //工资
    void setName(char* name);
    void getName(char* name);
    void averageSalary(CEmployee e1, CEmployee e2);
};
void CEmployee::setName(char* name) {
    strcpy(szName, name);              //OK
}
void CEmployee::getName(char* name) {
    strcpy(name, szName);              //OK
}
void CEmployee::averageSalary(CEmployee e1, CEmployee e2) 
{
    salary = (e1.salary + e2.salary) / 2;
}
int main()
{
    CEmployee e;
    strcpy(e.szName, "Tom1234567889");//编译出错不能访问私有成员
    e.setName("Tom");                 //OK
    e.salary = 5000;                  //OK
    return 0;
}

 

posted @ 2020-01-31 21:17  沐沐Y  阅读(152)  评论(0编辑  收藏  举报