关于const

const指针

  • 因此以下语句是错误的:pc[3]=‘x’;下列语句是允许的:pc=“efgh”;

  • 常指针把指针本身,而不是它指向的对象声明为常量。

    char const pc=“abcd”;//常指针

    pc[3]=‘x’;//合法;pc="efgh";//出错

  • 如果用const定义的是一个整型常量,关键词int可以省略

  • 实参与形参的结合是从左至右顺序进行的。因此指定默认值的参数必须放在形参表列中的最右端,否则出错

  • 函数后的修饰符const —— 表示该成员函数的执 行不会改变类的状态,也就是说不会修改类的数据成员。

const对象保护

  • const 对象的一般形式
1
2
类型名 const 对象名[(构造实参表列)];
const 类型名 对象名[(构造实参表列)];

注意:常对象必须要有初值(因为以后不能改值了)。

  • 限定作用:定义为 const 的对象的所有数据成员的值都不能被修改。凡出现调用非const的成员函数,将出现编译错误。但构造函数除外。

    1
    2
    3
    Time const t1(12,34,46);   // t1是常对象
    t1.set_Time(); // 编译错误PE,非const成员函数
    t2.show_Time(); // 错误,非const成员函数
  • mutable成员:对数据成员声明为mutable(易变的)时,即使是const对象,仍然可以修改该数据成员值。

  • 常对象成员

    • 常数据成员:用 const 声明的常数据成员,其值是不能改变的。只能通过构造函数的参数初始化表对常数据成员进行初始化。

    • 常成员函数:成员函数声明中包含const时为常成员函数。此时,该函数只能引用本类中的数据成员,而不能修改它们(注意:可以改mutable成员)。

    • 注意:const是函数类型的一部分,在声明函数和定义函数时都要有const关键字,在调用时不必加const。

    • 如果已定义了一个常对象,则只能调用其中的const成员函数,而不能调用非const成员函数(不论这些函数是否会修改对象中的数据)。如果需要访问对象中的数据成员,可将常对象中所有成员函数都声明为const成员函数,但应确保在函数中不修改对象中的数据成员。

    • 指向常对象的指针:

      1
      const 类型 *指针变量名

      不能通过它来改变所指向目标对象的值,但指针变量的值是可以改变的;如果变量被声明为常对象,只能用指向常对象(变量)的指针变量指向它,而不能非const型指针变量去指向它.

    • 指向某对象的常指针:指针的值不能改变

      1
      类型* const 指针变量名
  • const修饰函数

    1
    2
    3
    4
    int GetY() const;
    //该函数为只读函数,不允许修改其中的数据成员的值。
    const int * GetPosition();
    //修饰的是返回值,表示返回的是指针所指向值是常量。

void指针

  • void 通常表示无值,但将void作为指针的类型时,它却表示不确定的类型

    1
    2
    void  pa;//错误,不能声明void 类型的指针变量
    void* pc;//正确,可以声明void类型的指针
  • void型指针可以接受任何类型的指针的赋值,但对已获值的void型指针,对它在进行处理,如输出或传递指针值时,则必须进行强制类型转换,否则会出错。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <iostream.h>
    main()
    {void *pc;
    int i=456;
    char c='a';
    pc=&i;
    cout<<*(int *)pc<<endl;
    pc=&c;
    cout<<*(char *)pc<<endl;
    return 0;}

重载

重载函数间不能只是函数的返回值不同,应至少在形参的个数、参数类型或参数顺序上有所不同。

函数模板

1
template <class T>

作用域标识符

1
2
3
4
5
6
7
8
9
10
#include <iostream.h>
int avar=10;
main()
{
int avar;
avar=25;
cout<<"local avar ="<<avar<<endl;
cout<<"global avar="<<::avar<<endl;
return 0;
}

new标识符

1
2
3
4
5
6
7
8
 使用new为多维数组分配空间时,必须提供所有维的大小,如:int *pi=new int[2][3][4];
其中第一维的界值可以是任何合法的表达式,如:
int i=3;
int *pi=new int[ i ][2][3];
new可在为简单变量分配内存空间的同时,进行初始化。这时的语法形式为:
指针变量=new 类型名(初始值列表)
例如:
p=new int(99); // 动态分配内存,并将99作为初始值赋给它