C++_const常量

来源:互联网 发布:知乎嗜血法医 编辑:程序博客网 时间:2024/05/01 18:24

1.符号常量

对于符号常量:用一个标识符代表的常量,在程序中用#define命令定义某个符号代表的常量。

#define M "男"#define W "女"#define pi 3.1415

2.const常量

对于const常量:冻结变量,修饰类型描述符。

const double pi = 3.14159265;
特点:被const冻结的对象不能再被更新,所以在定义时必须初始化。

const int a = 500,b = 20;//或者int const a = 500,b = 20;a = 700;b = 30;//错误

(1)指向常量的指针

指针指向的变量不可变,指针本身的值可变。

#include<iostream>using namespace std;int main(){    const int a = 18;    const int b = 20;    const int *p = &a;    int c = 11;//    a = 98;//出错//    *p = 99;//出错//    p = &b;//    *p = 33;//出错//    p = &c;//    *p = 23;//出错,虽然c不是const,但是规定p指向的变量值不能变   cout << *p << endl;   cout << &a << endl;   cout << p <<endl;    return 0;}

(2)指针常量

定义时,在指针前面加const,标识指针本身是常量,不可以改变指针的指向,但是指针指向的变量的值可以改变。
#include <iostream>using namespace std;int main(){    int a = 100, b = 200;    int *const p1 = &a;//定义指针常量    int  *p2 = &b;    cout << *p1 << " " << *p2 << endl;    *p1 = 300;//改变a值//    p1 = &b;//错误,指针常量不可以改变指向    p2 = &a;    cout << *p1 << " " << *p2 << endl;    cout << a << " " << b << endl;    return 0;}<strong></strong>

(3)指向常量的指针常量

#include <iostream>using namespace std;int main(){    const int a = 1;    int b = 2;    const int * const p1 = &a;//p1为指向常量的指针变量    const int * const p2 = &b;//p2为指向常量的指针变量//    p1 = &b;//出错//    p2 = &a;//出错//    *p1 = 22;//出错//    *p2 = 23;//出错,p2为指向常量的指针变量,尽管b不是const常量//    a = 25;//出错,a是const常量    b = 24;    cout << *p1 << " " << *p2 << endl;    return 0;}

(4)用const限定引用

一般情况下,在调用函数时,需要建立实参的副本,就是说把实参拷贝给形参,如果被传递的数据类型很大,开销也很大。如果采用指针或引用的形式,则不需要建立副本,但是会产生实参被修改的危险。如果调用函数时不建立副本以提高运行效率,又不希望有实参被改动的危险,则采用传递const指针或const引用(即:实参是地址或引用,形参定义成const型的指针或引用)的方法。
#include <iostream>using namespace std;int fn(const int &c){    return c;}int main(){    int a = 1;    cout << fn(a) << endl;    return 0;}

3.const应用于对象中

C++虽然采取了不少有效的措施(如设private保护)以增加数据的安全性,但是有些数据却往往是共享的,人们可以在不同的场合通过不同的途径访问同一个数据对象。有时在无意之中的误操作会改变有关数据的状况,而这是人们所不希望出现的。
既要使数据能在一定范围内共享,又要保证它不被任意修改,这时可以使用const,即把有关的数据定义为常量。

举例:

Time const t1     t1是常对象,其值在任何情况下都不能改变;

void Time::fun() const   fun是Time类中的常成员函数,可以引用,但是不能修改本类中的数据成员;

Time *const p  p是指向Time对象的常指针,p的值(即p的指向)不能改变;

const Time *p p是指向Time类常对象的指针,其指向的类对象的值不能通过指针来改变;

const Time &t1 = t t1是Time类对象t的引用,二者指向同一段内存空间。


常成员函数

格式:类型说明符  函数名(参数表)  const

这里的const是函数类型的一个组成部分,因此在实现部分也要带const关键字,const关键字可以被用于参与对重载函数的区分,通过常对象只能调用它的常成员函数。

常数据成员

使用const说明的数据成员。

例:常成员函数举例

#include<iostream>using namespace std;class point{private:int x;int y;public:point(int vx, int vy):x(vx),y(vy){}void print();void print() const;};void point::print(){cout << "调用print函数" << endl;cout << "x = " << x << ", y = " << y << endl;}void point::print() const{cout << "调用print const函数" << endl;cout << "x = " << x << ", y = " << y << endl;}int main(){point p1(1, 2);p1.print();point const p2(2, 3);p2.print();getchar();}/*运行结果:调用print函数x = 1, y = 2调用print const函数x = 2, y = 3*/

例:常数据成员举例

#include <iostream>using namespace std;class A{private:const int a;static const int b;//静态数据成员public:A(int i):a(i){}//带参数的构造函数void print(){cout << a << " " << b << endl;}};const int A::b = 10;//静态数据成员初始化int main(){A a1(11);a1.print();getchar();}/*11 10*/

例:常引用做参数

#include<iostream>using namespace std;class point{private:float x;float y;public:point(float vx, float vy):x(vx),y(vy){}friend float distance(const point &a, const point &b);};float distance(const point &a, const point &b)//两点之间的距离,传入的参数为常引用{float X = a.x - b.y;float Y = a.y - b.y;float distance;distance = sqrt(X * X + Y * Y);return distance;}int main(){point p1(0, 0), p2(1, 1);cout << "distance:" << distance(p1, p2) << endl;getchar();}/*运行结果:distance:1.41421*/






1 0
原创粉丝点击