C++常数据(函数)成员

                                 C++常数据成员精讲—const关键字


内容提要:
用const修饰的定义对象称为常对象;
用const修饰的声明成员函数称为常成员函数;
用const修饰的声明数据成员称为常数据成员。
变量或对象被 const修饰后其值不能被更新。因此被const修饰的变量或对象必须要进行初始化。
用const修饰的声明数据成员称为常数据成员。
有两种声明形式:
const int  cctwl;
int const  cctwl;
int cctwl  const; //这样是错误的只能有以上两种声明形式。不能省略数据类型,可以添加 public private等访问控制符。
说明:
1.任何函数都不能对常数据成员赋值。
2.构造函数对常数据成员进行初始化时也只能通过初始化列表进行。
3.常数据成员在初始化时必须赋值或称其必须初始化.
4.如果类有多个默认构造函数必须都初始化常数据成员。
通过下面例子来理解常数据成员以上4点。
A、请指出下面程序的错误
class A
{
private:
int w,h;
      const int cctwl=5;  //错误一
public:
};
void main()
{  
         A a ;   //错误二  
       cout<< "sss";
         system("pause");
}
错误一:不能对常数据成员在类中初始化、要通过类的构造函数,只有静态常量才能这样初始化。
错误二:没有合适的默认构造函数可用。因为有常量cctwl没有初始化必须初始化所有常数据成员。
更正后结果如下:
class A{
private:
    int w,h;
    const int cctwl;
 public:
  const int cctwlcom;//常对象可以是共有私有等访问权限
  A():cctwl(5),cctwlcom(8){};//通过构造函数初始化列表初始化常成员数据。
};
B、多个构造函数下的常数据成员
请指出下面程序的错误:
class A{
private:
    int w,h;
     const int  cctwl;
public:
    const int cct;
    A():cctwl(5),cct(6){};
   
A(int x,int y) //错误一   
{
         w=x,h=y;
    }
};
void main()
{
    A a ;
    A b(3,8);
    cout<< "sss";
    system("pause");
}
错误一:每个构造函数都要初始化常数据成员应改为
A(int x,int y):cctwl(7),cct(8)
 {
    w=x,h=y;
 }



                                C++常成员函数 - const 关键字

 

 

一、常成员函数详解
声明:<类型标志符>函数名(参数表)const;
说明:
(1)const是函数类型的一部分,在实现部分也要带该关键字。
(2)const关键字可以用于对重载函数的区分。
(3)常成员函数不能更新任何数据成员,也不能调用该类中没有用const修饰的成员函数,只能调用常成员函数和常数据成员。
A、通过例子来理解const是函数类型的一部分,在实现部分也要带该关键字。
class A{
private:
    int w,h;
public:
    int getValue() const;
    int getValue();
    A(int x,int y)
    {
        w=x,h=y;
    }
    A(){}
};
int A::getValue() const    //实现部分也带该关键字
{
    return w*h; //????
}
void main()
{
    A const a(3,4);
    A c(2,6);
cout<<a.getValue()<<c.getValue()<<"cctwlTest";
system("pause");
}
B、通过例子来理解const关键字的重载
class A{
private:
    int w,h;
public:
int getValue() const
{
        return w*h;
    }
    int getValue(){
        return w+h;
    }
    A(int x,int y)
    {
        w=x,h=y;
    }
    A(){}
};
void main()
{  
    A const a(3,4);
    A  c(2,6);
    cout<<a.getValue()<<c.getValue()<<"cctwlTest"; //输出12和8
    system("pause");
}
C、通过例子来理解常成员函数不能更新任何数据成员
class A{
private:
    int w,h;
public:
    int getValue() const;
    int getValue();
    A(int x,int y)
    {
        w=x,h=y;
    }
    A(){}
};
int A::getValue() const
{
    w=10,h=10;//错误,因为常成员函数不能更新任何数据成员
    return w*h;
}
int A::getValue()
{
    w=10,h=10;//可以更新数据成员
    return w+h;
}
void main()
{
     A const a(3,4);
    A  c(2,6);
    cout<<a.getValue()<<endl<<c.getValue()<<"cctwlTest";                            system("pause");
}
D、通过例子来理解
1、常成员函数可以被其他成员函数调用。
2、但是不能调用其他非常成员函数。
3、可以调用其他常成员函数。
class A{
private:
    int w,h;
public:
    int getValue() const
 {
   return w*h + getValue2();//错误的不能调用其他非常成员函数。
 }
    int getValue2()
    {
       
        return w+h+getValue();//正确可以调用常成员函数
    }
   
    A(int x,int y)
    {
        w=x,h=y;
    }
    A(){}
};
void main()
{
    A const a(3,4);
    A       c(2,6);
cout<<a.getValue()<<endl<<c.getValue2()<<"cctwlTest";                   
system("pause");
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值