『新標準C++プログラミング』2.4-2.6(C++学習ノート4)

7033 ワード

1、オブジェクトのメモリマッチング
一般に、C++では、1つのオブジェクトが占有するメモリ領域のサイズは、そのメンバー変数が占有するメモリ領域のサイズの和に等しい.(オブジェクトにはメンバー変数のみが含まれ、メンバー関数は含まれません)
各オブジェクトにはそれぞれのストレージスペースがあります.あるオブジェクトのメンバー変数が変更されると、別のオブジェクトには影響しません.
2、クラスのメンバー変数とメンバー関数の使用方法
①対象名メンバー名
②ポインタ->メンバー名
③引用名メンバー名
3、クラスメンバーのアクセス可能範囲
private:プライベートメンバーを指定します.このクラスのメンバー関数内でのみアクセスできます.
public:共有メンバーを指定します.どこでも訪問できます.
protected:保護メンバーを指定します.
3つのキーワードの出現回数と前後順序には制限はありません.
メンバーの前にアクセス範囲説明子がない場合、classではデフォルトでプライベートメンバーとみなされます.structの場合、このメンバーはデフォルトで公有メンバーとみなされます.
クラスのメンバー関数の内部で、現在のオブジェクトのすべての属性、関数にアクセスできます.クラスの他のオブジェクトのすべてのプロパティ、関数は、クラスのメンバー関数以外の場所で、クラスのオブジェクトの共有メンバーにのみアクセスできます.
4、非表示
プライベートメンバーを設定するメカニズムを非表示と呼びます.その目的の1つは、メンバー変数へのアクセスをメンバー関数で強制することです.このような利点は、メンバー変数のタイプなどの属性を変更した場合、メンバー関数を変更するだけでよいことです.それ以外の場合、メンバー変数に直接アクセスするすべての文を変更する必要があります.
5、メンバー関数のリロードとパラメータのデフォルト
メンバー関数はリロードできます.デフォルトのパラメータを持つことができます.デフォルトのパラメータを使用するには、関数の再ロード時の二義性を避けることに注意してください.
6、サンプルプログラムの剖析
(1)
#include
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
#include
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;
}