例1:
例2:自CSDN帖子
两个类,同样是两个const的成员函数,返回值都是int指针
但是类A实际返回的是一个数组,类B则返回的是一个指针
但是类A不能通过编译,类B可以,这是为什么?
原因:
在 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 所以它可以初始化返回值..
#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 所以它可以初始化返回值..