您的位置:首页 > 其它

const成员函数返回数组名

2012-10-12 17:08 197 查看
例1:
#include<iostream>
using namespace std;
struct str
{
string a;
string b;
};

class B
{
private:
int a;
struct str s[10]; //数组名可以转换为指向其指代实体的指针,而且是一个指针常量
public:
void sets(string str,int n=10)
{
for(int i=0;i<10;i++)
{
s[i].a=str;
s[i].b=str;
}
}

//或者 cosnt str * gets() const{return s; }//第2个const表示 s被限定为const指针,所以返回类型也要求是const型。
str* gets(){ return s; }//如果是str* gets()const{return s;}则会报const *转非const *的类型错误
};

int main()
{
B b;
b.sets("hello");
str* st=b.gets();
for(int i=0;i<10;i++)
{
cout<<"a"<<i<<" "<<st[i].a<<endl;
cout<<"b"<<i<<" "<<st[i].b<<endl;
}
getchar();
return 0;
}
编译运行正确。

例2:自CSDN帖子

两个类,同样是两个const的成员函数,返回值都是int指针

但是类A实际返回的是一个数组,类B则返回的是一个指针

但是类A不能通过编译,类B可以,这是为什么?

class A
{
public:
int* f1() const
{
return m_array;
}
int m_array[10];
};

class B
{
public:
int* f1() const
{
return m_point;
}
int* m_point;
};
和上例一样的效果。

原因:

在 A 的 const 函数里, m_array 的类型是 int const [10], 即 const int *

在 B 的 const 函数里, m_point 的类型是 int * const.

即一个指向的类型是 const 的, 一个是指针本事是 const 的.

指向的类型不同的指针是不能互相转换的.

A中函数返回数组 而且是const函数 说明这个数组成员返回时被限定为const 返回数组时是返回数组的首地址 而且这个首地址是不变的 这就意味着返回的指针本身是const 它所指向的对象也是const 即实际返回类型应为const int* const

  B中函数返回一个成员指针 而且也是const函数 说明这个成员指针本身被限定为const 注意 只是它本身被限定 它所指向的对象就不保证被限定为const 所以它实际应返回 int* const

  根据C++标准 指向const对象的指针不能给指向非const对象的指针初始化和赋值 而你指定的返回类型都为int* 即非const指针 函数返回时要用实际被返回的内容初始化返回值 这里问题就出来了 前者实际需要返回指向const对象的指针 而你指定了返回类型为指向非const对象的指针 这里就违背了C++标准 而后者实际返回的指针本身为const 但它所指向的对象为非const 所以它可以初始化返回值..
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  string class struct c