const拾遗

1.const只能修饰输入参数,不能修饰输出参数.
   void  strcpy ( const  char  *src , char  * targ);函数 strcpy() 将 src 字符串的内容复制到 targ 字符串中,为保证 src 字符串不被修改,将它定义为 const 参数.
2.当是输入参数内置类型时,不需要是void Func(const int i),void Func(int& i),void Func(const int& i),可以是void Func(int i)。
a.因为输入参数采用"值传递"(const int i),由于函数将自动产生临时变量用于复制该参数,该输入参数本来就无需保护,所以不要加const修饰;
b.不用(const )int& i的原因在于内部数据类型的参数不存在构造、析构的过程,而复制也非常快,"值传递"和"引用传递"的效率几乎相当.








3.当是输入参数非内部数据类型时,不需要是void Func(const A a),void Func(A a),可以是void Func(A& a)或void Func(const A& a)
a.不用const A a,A a的原因是函数的效率比较低,因为函数体内将产生A类型的临时对象用于复制参数a,而临时对象的构造、复制和析构过程都需要消耗时间
b.最好用const A&a的原因是A&a中的a可以被改变,A&a和const A&a的好处在于都不会产生临时对象,效率高;




4.const A Func(const A&a )const的好处
第一个const表示返回的是个内部产生的对象,它不能被修改
const A Func(...)
{...}
1.A a=Func(...);//初始化可以;调用赋值构造函数初始化.
2.A a;a=Func(...);//赋值不可以;
3.const A a; a=Func(.....);//这样可以。
4. A *a=&Func();//不可以//普通非const引用和指针绑定到const对象是不合法的,这个会产生修改const对象的风险。
第二个const表示输入的参数是引用传递,函数内部不会产生临时对象,而且这个对象不能被内部修改
第三个const表示此函数内部的所涉及的数据成员不能修改
class Stack
{
int m_num;
int GetCount(void) const;
int Pop(void);
}
int Stack::GetCount(void) const
{
m_num++;//编译错误,企图修改数据成员m_num;
Pop();//编译错误,企图调用非const函数
}
5.const 通常用来限制函数的指针参数,引用和数组参数,而一般形式的参数因为形参和实参本来就不在同一内存空间,所以对形参的修改不会影响实参,因此也没有必要限制函数体不能对参数进行修改。




6. const 指针可以接受const 和非 const 地址,但是非const 指针只能接受非const 地址。所以const  指针的能力更强一些,所以尽量多用const 指针,这是一种习惯。
7.const 返回值。
1. 函数返回值引用常量表示不能将函数调用表达式作为左值使用。例如前面讲的返回引用的函数 min( )。 int  & min ( int  &i,  int  &j); 
 函数返回值为 const  只有用在函数返回为引用的情况。
可以对函数调用进行赋值,因为它返回的是左值:  min ( a ,  b )=4;
但是,如果对函数的返回值限定为 const  的:const  int  & min ( int & i, int  &j );
那么,就不能对 min ( a, b ) 调用进行赋值了。




2.返回值为引用常量,则该常量不能调用非常量函数。
class A
{
    public:
        A():num(2)
        {
 
        }
        ~A()
        {
 
        }
        void setnum()  
        {
           // num = 10;
        }
        void getnum() const{
            printf("%d\\n",num);
        }
    private:
        int num;
};
 
class B
{
    public:
        B()
        {
 
        }
        ~B()
        {
 
        }
        const A& get()
        {
            A *p = new A();
            return *p;
        }
         
};




8.const函数的返回值必须const引用的例子。
int main()
{
    B b;
    b.get().getnum();
    b.get().setnum();
    return 0;
}
#include<stdio.h>
#include <string.h>
#include<iostream>
using namespace std;








class T{
public:
T(string p)
{
ptext = p;
}
const char & operator [](int pos) const
{
return ptext[pos];
}
string ptext;
};
int main()
{
string s = "abcd";
T t(s);
//t[0] = 't';//因为为const返回类型,所以不能赋值
printf("%s\n", s.c_str());
}
9.const int num;//报错:error C2734: 'num' : const object must be initialized if not extern  必须初始化改为:const int num=10;
10.const引用,对象和指针都可以用非const对象初始化。




#include<iostream>
using namespace std;
int main()
{    
int i;    //i=3;   
const int &j= i;    
i =20;    //这句话为什么合法,i不是被转化为const对象了吗?    
cout <<j<<" "<<i;//j,i都是20 - -!   
 system("pause");    
return 0;} 
i还是非const类型,将j定义为const引用,其实只是不能通过j修改i,还可以通过变量 i 来修改 i 的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值