co-2. 属性,アクセサ
1
金子邦彦
C++ オブジェクト指向プログラミング入門)(全3回)
URL: https://www.kkaneko.jp/pro/cpp/index.html
C++におけるクラスの属性定義とアクセサによる
プセル化の実装方法
【学習内容の構成】
1. メソッドと属性:オブジェクトに属する操作と、
.」「->」によるアクセス方法
2. オブジェクト生成new演算子によるオブジェ
クト生成とポインタ変数への格納
3. アクセサ:属性値の取得・更新を行うメソッド
によるカプセル化
前提:C++の基本文法、ポインタの理解
意義:属性値の意図しない書き換えリスクの抑制
2
メソッド
メソッドは,オブジェクトに属
する操作や処理のこと
引数(ひきすう)とは,メソッ
ドに渡す値のこと
メソッドは,クラスに属する
属性メソッドにアクセスするとき
.」や「->」を用いる
3
アクセサ
アクセサは,属性値の取得,属
性値の更新を行うためのメソッ
4
例題1
Ball クラスのオブジェクトを3
個生成し,それぞれのメモリア
ドレスの表示を行う
オブジェクトを生成したら,オ
ブジェクトアドレスは,ポイン
タ変数に格納する
5
クラスとオブジェクト
6
ball-1
ball-2
ball-3
3
4
1
1
3
4
Ball クラス
ソースコード
7
#pragma once
class Ball {
public:
double x, y;
public:
Ball( const double x, const double y );
Ball( const Ball& ball );
Ball& operator= ( const Ball& ball );
~Ball();
double distance_to_0() const;
};
コンストラクタ,
デストラクタ
属性(メンバ変数ともいう)
ファイル名: Ball.h
ソースコード
8
#include "Ball.h"
#include <math.h>
Ball::Ball( const double x, const double y ) : x( x ), y( y )
{
/* do nothing */
}
Ball::Ball( const Ball& ball ) : x( ball.x ), y( ball.y )
{
/* do nothing */
}
Ball& Ball::operator= (const Ball& ball )
{
this->x = ball.x;
this->y = ball.y;
return *this;
}
Ball::~Ball()
{
/* do nothing */
}
double Ball::distance_to_0() const
{
return sqrt( ( this->x * this->x ) + ( this->y * this->y ) );
}
ファイル名: Ball.cpp
ソースコード
9
#include <stdio.h>
#include "ball.h"
int main( int argc, char** argv )
{
Ball* b1 = new Ball( 3, 4 );
Ball* b2 = new Ball( 1, 1 );
Ball* b3 = new Ball( 3, 4 );
fprintf( stderr, "b1: %f, %f¥n", b1->x, b1->y );
fprintf( stderr, "b2: %f, %f¥n", b2->x, b2->y );
fprintf( stderr, "b3: %f, %f¥n", b3->x, b3->y );
delete b1;
delete b2;
delete b3;
}
ファイル名: main.cpp
-> による属性アクセス
Visual Studio 2019 C++ での実行結果例
10
例題2
アクセサを定義し使用する
11
ソースコード
12
#pragma once
class Ball {
private:
double _x, _y;
public:
Ball( const double x, const double y );
Ball( const Ball& ball );
Ball& operator= ( const Ball& ball );
~Ball();
double distance_to_0() const;
double x() const { return this->_x; };
double y() const { return this->_y; };
};
コンストラクタ,
デストラクタ
属性(メンバ変数ともいう)
ファイル名: Ball.h
アクセサ
アクセサを定義.属性の読み出しは可能
ソースコード
13
#include "Ball.h"
#include <math.h>
Ball::Ball( const double x, const double y ) : _x( x ), _y( y )
{
/* do nothing */
}
Ball::Ball( const Ball& ball ) : _x( ball.x() ), _y( ball.y() )
{
/* do nothing */
}
Ball& Ball::operator= (const Ball& ball )
{
this->_x = ball.x();
this->_y = ball.y();
return *this;
}
Ball::~Ball()
{
/* do nothing */
}
double Ball::distance_to_0() const
{
return sqrt( ( this->x() * this->x() ) + ( this->y() * this->y() ) );
}
ファイル名: Ball.cpp
メソッド本体内ではアクセサを使用
ソースコード
14
#include <stdio.h>
#include "ball.h"
int main( int argc, char** argv )
{
Ball* b1 = new Ball( 3, 4 );
Ball* b2 = new Ball( 1, 1 );
Ball* b3 = new Ball( 3, 4 );
fprintf( stderr, "b1: %f, %f¥n", b1->x(), b1->y() );
fprintf( stderr, "b2: %f, %f¥n", b2->x(), b2->y() );
fprintf( stderr, "b3: %f, %f¥n", b3->x(), b3->y() );
delete b1;
delete b2;
delete b3;
}
ファイル名: main.cpp
アクセサによる
属性アクセス
Visual Studio 2019 C++ での実行結果例
15
属性を public にする場合
属性値を意図せず書き換えるリスク
アクセサを作る場合
アクセサでは,属性値の書き換え不可.
属性値を意図せず書き換えるリスクを抑制.
16