上面两篇博文地址:
C++中const关键字用法详解及实例和源码下载(一)
C++中const关键字用法详解及实例和源码下载(二)
继续紧接着上面两篇博文的内容讲述const关键字的用法。
- 指向对象的常指针
将指向对象的常指针变量声明为const型并将之初始化,这样的指针始终保持为其初值,不能改变,即其指向始终不变。
一般形式为:
类名 * const 指针变量名 = 对象地址;
常常使用常指针作为函数的形参,目的是不允许在函数执行过程中改变指针变量的值,使其时钟指向原来的对象。
实例代码:
#include<iostream>
#include<string>
using namespace std;
class Test{
public:
Test();
Test(int,string);
void display();
private:
int age;
string name;
};
Test::Test(int a,string nam){
age = a;
name = nam;
}
void Test::display(){
cout<<"age="<<age<<",name="<<name<<endl;
}
int main(){
Test stu(10,"dd");
stu.display();
Test * const p = &stu;
p->display();
(*p).display();
return 0;
}
实例代码中使用了指向对象的常指针的用法。大家可以试试,该常指针不能指向另一个对象,并且必须进行初始化操作。有一点要注意的是,可以改变它所指向的对象的数据成员的值。
- 指向常对象的指针变量
#include<iostream>
#include<string>
using namespace std;
class Test1{
public:
Test1(int,string);
void display() const;
private:
int age;
string name;
};
Test1::Test1(int a,string nam){
age = a;
name = nam;
}
void Test1::display() const{
cout<<"age="<<age<<",name="<<name<<endl;
}
int main(){
Test1 test1(23,"ddee");
test1.display();
const Test1 * pp = &test1;
Test1 const * pp1 = &test1;
(*pp).display();
(*pp1).display();
pp->display();
pp1->display();
cout<<"=======分隔符========="<<endl;
Test1 const test2(25,"ffee");
test2.display();
const Test1 * pp2 = &test2;
pp2->display();
return 0;
}
结果:
从结果可以看出:
定义指向常变量的指针变量的一般形式为:
1、const 类型 * 指针变量名 (或者)
类型 const * 指针变量名
2、如果一个变量已被声明为常变量,只能用指向常变量的指针变量指向它,而不能用一般的指针变量指向它。
3、指向常变量的指针除了可以指向常变量外,还可以指向未被声明为const的变量。此时不能通过指针变量改变变量的值。
下面再来看代码
#include<iostream>
#include<string>
using namespace std;
class Test1{
public:
Test1(int,string);
void display() const;
void setvalue(int) const;
private:
int age;
string name;
};
Test1::Test1(int a,string nam){
age = a;
name = nam;
}
void Test1::display() const{
cout<<"age="<<age<<",name="<<name<<endl;
}
void Test1::setvalue(int a) const{
age = a;
}
int main(){
Test1 test1(23,"ddee");
test1.display();
const Test1 * pp = &test1;
Test1 const * pp1 = &test1;
(*pp).display();
(*pp1).display();
pp->display();
pp1->display();
cout<<"=======分隔符========="<<endl;
Test1 const test2(25,"ffee");
test2.display();
const Test1 * pp2 = &test2;
pp2->display();
//改变指针pp的值
cout<<"改变指针pp的值"<<endl;
pp = &test2;
pp->display();
// pp->setvalue(12);
// pp->display();
return 0;
}
结果:
这段代码改变了pp的值,说明指向常对象的指针变量可以改变指向。
值得注意的是,如果把代码中的注释部分取消,则是编译不通过的,说明指向常对象的指针变量不能改变它所指向的变量的值。
总结如下:
1、const 类型 * 指针变量名 (或者)
类型 const * 指针变量名
2、如果一个变量已被声明为常变量,只能用指向常变量的指针变量指向它,而不能用一般的指针变量指向它。
3、指向常变量的指针除了可以指向常变量外,还可以指向未被声明为const的变量。此时不能通过指针变量改变变量的值。
4、指向常对象的指针常用于函数的形参,目的是在保护形参指针所指向的对象,是它在函数执行过程中不被修改。
5、如果定义了一个指向常对象的指针变量,是不能通过他改变所指向对象的值的,但是指针变量本身的值是可以改变的。
- 对象的常引用
代码如下:
#include<iostream>
#include<string>
using namespace std;
class Time{
public:
Time(int,int,int);
void display();
int hour;
int min;
int sec;
};
Time::Time(int h,int m,int s){
hour = h;
min = m;
sec = s;
}
void Time::display()
{
cout<<"hour="<<hour<<",min="<<min<<",sec="<<sec<<endl;
}
void fun(Time &t){
t.hour = 19;
}
int main(){
Time time(12,12,12);
time.display();
fun(time);
time.display();
return 0;
}
结果:
这段代码是很常规的对象的引用的例子,利用对象的引用改变原来对象的值。
如果不希望函数中修改实参的值,可以把函数的形参修改为如下形式:
void fun(Time const &t){
t.hour = 19;
}
再次进行编译,则会出错,因为函数fun中尝试修改的引用t所引用对象的值。
这样就保证了在函数中不能修改形参所引用对象的值。
在C++的面向对象的程序设计中,经常使用常指针和常引用做函数的形参。这样既保证数据安全,使数据不能随意修改,在调用函数时又不必建立实参的拷贝!!
博文链接:
C++中const关键字用法详解及实例和源码下载(一)
C++中const关键字用法详解及实例和源码下载(二)