const和static的用法

const和static的用法总结

const的用法

1. const修饰变量和指针

const修饰变量和指针即表示该变量和指针不能被修改,一般在遇到const char* 的时候会
产生歧义.const char* 这种结构的定义其实只要找到const修饰的是哪种变量类型就可以
知道究竟哪个量是不可修改的了.比如, const (char*) pBuffer const修饰的是 char*
类型 ,所以pBuffer作为一个char*类型的变量被const,pBuffer的值也就是这个指针的值是
不能被修改的.而 const (char) *pBuffer const修饰的是char类型,所以*pBuffer的char
内容是不能被修改的.所以以后要是有人给你出这种题目,抓住const修饰的类型就好了.

2. const修饰函数参数

这种情况主要是为了保护实参在函数内不被改变,比如 void function(const char *p),p所
指向的内容是不能在函数中被修改的,否则编译不通过.还有 int function(const A &a)这种
用法,避免拷贝构造函数的调用和析构函数的调用,采用传引用的方法,加const修饰可以避免
函数内部对a对象的修改.

3. 用const修饰函数的返回值

如果给以“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的内
容不能被修改,该返回值只能被赋给加const修饰的同类型指针。
例如函数:
1
const char * GetString(void);
如下语句将出现编译错误:
1
char *str = GetString();
正确的用法是
1
const char *str = GetString();

4. const成员函数

任何不改变成员变量值的成员函数都应该被定义为const成员函数,const放在函数声明后面

1
2
3
4
5
6
7
8
9
10
11
12
class CStack
{
public:
int GetCount() const;
private:
int m_dwNum;
}

CStack::GetCount() const
{
m_dwNum++; //编译错误,不能对成员变量进行修改;
}

总之,const的作用就是定义只读,在一定程度上控制程序员的失误操作,保证程序的健壮和稳定.


static的用法

  1. 隐藏

    在两个源文件中,如果定义了全局的变量和函数,两个源文件中都可以使用这些全局变量和函数,
    如果想让变量和函数只在当前文件中起作用,就要加static前缀将函数隐藏在本源文件中.

  1. 类的静态成员

    类的静态成员只属于类本身,不属于任何一个类实例,所以没有this指针.如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class CStack
    {
    public:
    static int m_dwCount;
    static int GetCount() const;
    }
    int CStack::m_dwCount = 10;
    CStack::GetCount()
    {
    return m_dwCount;
    }
    //静态成员函数不能访问类的私有成员,只能访问类的静态成员,
    //实际上,它就是增加了类的访问权限的全局函数

    静态成员必须要在定义中初始化.