constポインタとconstメンバ変数
ポインタ変数に格納するアドレスを定数化するのがconstポインタ普通の変数と概念的には同じ
constメンバ変数に関しては初期化子をつかわないと初期化できない

なんかconstにもいろいろ種類があることがわかったので調べてみた・・・
うまい使い方すれば若干安全性があがるかなぁと・・・
需要ないかもしれないけど
静的でないconstメンバ変数の配列を初期化する方法がしりたかったり
static constのメンバ変数の配列なら、初期化方法わかってるんだけど・・・
最近、アドレスと値をセットでみないと納得できなくなってきた

#include <stdio.h>

class ConstClass
{
private:
const static int count[]; // 要素数書かなくても初期化可能
const int *num1; // 値書き換え不能
int *const num2; // アドレス書き換え不能
const int *const num3; // 値、アドレス書き換えともに不能
public:

// constメンバ変数は初期化リストでしか初期化できない
// 初期化のとき渡す引数に同じポインタを入れないように注意!!
ConstClass(const int *a,int *const b,const int *const c):num1(a),num2(b),num3(c)
{
}
void SetNum()
{
}

void printNum1()
{
const int b[] = {4,5,6};
num1 = b; // 書き変わっちゃう

printf("call printNum1\n");
for(int i = 0;i < 3;++i)
{
//num1[0] = 1; // エラー
printf("%p %d\n",&num1[i],num1[i]);
}
printf("\n");
}

void printNum2()
{
const int b[] = {4,5,6};
//num2 = b; // エラー

printf("call printNum2\n");
for(int i = 0;i < 3;++i)
{
num2[i] = b[i]; // 書き変わっちゃう
printf("%p %d\n",&num2[i],num2[i]);
}
printf("\n");

}

void printNum3()
{
const int b[] = {4,5,6};
//num3 = b; // エラー

printf("call printNum3\n");
// アドレスも値も変更できない
for(int i = 0;i < 3;++i)
{
//num3[i] = b[i]; // エラー
printf("%p %d\n",&num3[i],num3[i]);
}
printf("\n");

}


void printStaticCount()
{
printf("call printStaticCount\n");
for(int i = 0;i < 3;++i)
{
printf("%p %d\n",&count[i],count[i]);
}
}

virtual ~ConstClass(){}
};

// constな静的変数
const int ConstClass::count[] = {10,20,30};


int main()
{
int a[] = {1,2,3};
int b[] = {1,2,3};
int c[] = {1,2,3};


ConstClass test(a,b,c);

// 初期化のとき渡す引数に同じポインタを入れないように注意!!
// ConstClass test(a,a,a);
test.printNum1();
test.printNum2();
test.printNum3();

test.printStaticCount();

return 0;
}
選択肢 投票
(^ω^)ktkr 0  
普通 0  
。(`ω´#)。なんじゃこりゃああ 0  

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS