const成员函数返回数组名

例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 所以它可以初始化返回值..


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值