こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

constについて

#include <iostream>
using namespace std;
class I
{
int *x;
public:
unsigned int size;
I(){size=0;x=new int[size];}
I(unsigned int i){size=i;x=new int[size];}
~I(){delete []x;}
int &operator()(unsigned int i){return x[i];}//!!!!
const int &operator()(unsigned int i) const{return x[i];}//????
};
void main()
{
I a(10);
for(int i=0;i<10;i++)a(i)=i;a(2)=a(0);
for(int i=0;i<10;i++)cout<<a(i);
}

この場合は//????はいらないと思いますが
//????を定義することがありますがどんな場合でしょう
//!!!!があるのにあったほうがいいのはどんな場合でしょう?

投稿日時 - 2002-12-16 05:25:06

QNo.428753

暇なときに回答ください

質問者が選んだベストアンサー

> 厳密な型宣言のため
> const int &operator()(unsigned int i) const{return x[i];}//????
> の中の後ろのconstはいると思うのですが
> 前のconstはいるのでしょうか?

なかったらとてもヤバいことがおこります。

const I a(5);
a(1) = 3; // a は const のはずなのに、中身が書き換わる!!

>> 大抵の参考書に書いてあると思うがなぁ:
> なにせまだ規格が流動的でSTLが規格になっていないときの本なのでだいぶ抜けているのです

ならば参考書買い替えの時期では?
それにこの件に関する限り、STLとは何の関係もありません。

投稿日時 - 2002-12-16 12:34:47

お礼

確認しました
STLについては古いことを説明するために出したもので他意はありません
ありがとうございました

投稿日時 - 2002-12-16 12:52:26

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

> //????を定義することがありますがどんな場合でしょう

const I a; に対し a(i) したいとき。

> //!!!!があるのにあったほうがいいのはどんな場合でしょう?

a(i)に対して代入することで、a.x[i]を書き換えたいとき。

# 大抵の参考書に書いてあると思うがなぁ...

投稿日時 - 2002-12-16 11:52:49

補足

厳密な型宣言のため
const int &operator()(unsigned int i) const{return x[i];}//????
の中の後ろのconstはいると思うのですが
前のconstはいるのでしょうか?

大抵の参考書に書いてあると思うがなぁ:
なにせまだ規格が流動的でSTLが規格になっていないときの本なのでだいぶ抜けているのです

説明を簡単時するために最小限の記述にしましたが下が全体像です
sizeを変更できないようにpribateにしてgetsize()なる関数を定義すべきですが・・・・

#include <iostream>
using namespace std;
class I
{
int *x;
public:
int size;
I(){size=0;x=new int[size];}
I(int i){size=i;x=new int[size];}
I(const I &a)
{
if(size)delete []x;size=a.size;x=new int[size];
for(int i=0;i<size;i++)x[i]=a(i);
}
~I(){delete []x;}
I &operator=(const I &a)
{
if(size)delete []x;size=a.size;x=new int[size];
for(int i=0;i<size;i++)x[i]=a(i);return *this;
}
int &operator()(int i){return x[i];}//!!!!
const int &operator()(int i) const{return x[i];}//????
};
ostream &operator<<(ostream &cout,const I &a)
{for(int i=0;i<a.size;i++)cout<<a(i);cout<<"\n";return cout;}
void main()
{
I a(10),b,c;
for(int i=0;i<a.size;i++)a(i)=i;a(2)=a(0);
cout<<a<<b<<c;cout<<a;c=b=a;cout<<a<<b<<c;
}

投稿日時 - 2002-12-16 11:56:08