余晖落尽暮晚霞,黄昏迟暮远山寻
本站
当前位置:网站首页 > 编程知识 > 正文

一个3k与30k对于const 的使用(全师门就我一个废柴)

xiyangw 2022-11-26 17:05 20 浏览 0 评论

1) const 对象的一般形式

  • 类型名 const 对象名[(构造实参表列)];
  • const 类型名 对象名[(构造实参表列)];

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

2) 限定作用:


定义为const的对象的所有数据成员的值都不能被修改。

凡出现调用非const的成员函数,将出现编译错误。但构造函数除外。

Time const t1(12,34,46); // t1是常对象

t1.set_Time(); // 编译错误PE, 非const成员函数

t2.show_Time(); // 错误,非const成员函数

3) mutable成员


对数据成员声明为mutable(易变的)时,即使是const对象,仍然可以修改该数据成员值。

常对象成员

1)常数据成员


使用const说明的数据成员称为常数据成员,其值是不能改变的。

如果在一个类中说明了常数据成员,那么构造函数就只能通过初始化列表对该数据成员进行初始化,而任何其他函数都不能对该成员赋值。

class Time

{

const int hour; // 声明hour为常数据成员

Time(int h):hour(h){} // 通过参数初始化表对常数据成员hour初始化

};

class Time

{

const int hour; // 声明hour为常数据成员

Time(int h)

{

hour = h; // 错误

}

};

例3.30 常数据成员举例。


#include <iostream.h>

class Date {

public:

Date(int y,int m,int d);

void showDate();

const int &r;

private:

const int year;

const int month;

const int day;

};

Date::Date(int y,int m,int d):year(y),month(m),day(d),r(year){ }

inline void Date::showDate()

{

cout<<"r="<<r<<endl;

cout<<year<<"."<<month<<"."<<day<<endl;

}

void main()

{

Date date1(1998,4,28);

date1.showDate();

}

2)常成员函数


在类中使用关键字const说明的函数为常成员函数。

常成员函数的说明格式如下:

类型说明符 函数名(参数表) const;

void show_Time( ) const; // 注意const的位置在函数名和括号之后

void Time::show_Time const

{

cout << hour << minute << sec << endl;

}

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

例3.28 常引用作函数形参


#include<iostream.h>
int add(const int& i,const int& j);
void main()
{
 int a=20;
 int b=30;
 cout<<a<<"+"<<b<<"="<<add(a,b)<<endl;
}
int add(const int& i,const& j)
{
 return i+j;
}

如果将一个对象说明常对象,则通过该对象只能调用它的常成员函数,而不能调用普通成员函数。而且常成员函数也不能更新对象的数据成员。

例3.31 常成员函数的使用。


#include <iostream.h>

class Date {

public:

Date(int y,int m,int d);

void showDate();

void showDate() const;

private:

int year;

int month;

int day;

};

Date::Date(int y,int m,int d):year(y),month(m),day(d){ }

void Date::showDate()

{

cout<<"ShowDate1:"<<endl;

cout<<year<<"."<<month<<"."<<day<<endl;

}

void Date::showDate() const

{

cout<<"ShowDate2:"<<endl;

cout<<year<<"."<<month<<"."<<day<<endl;

}

void main()

{

Date date1(1998,4,28);

date1.showDate();

const Date date2(2002,11,14);

date2.showDate();

}

常成员函数只能引用本类中的数据成员,而不能修改它们,即成员数据不能作为语句的左值。

(注意:可以改mutable成员)

例 const对象及mutable成员


class Time{
public:
 Time()
 {
 hour = 0;
 minute = 0;
 }
 void set_Hour(int h) const { hour = h;}
 void set_Minute(int m) { minute = m; }
 void show_Time() const
 { cout<<hour <<":"<<minute << endl; }
private:
 mutable int hour;
 int minute;
};
int main()
{
 Time t1;
 t1.set_Hour(8);
 t1.set_Minute(8);
 t1.show_Time();
 Time const t2;
 t2.set_Hour(8);
 t2.set_Minute(8);
 t2.show_Time();
 return 0;
}

3)常成员的使用


  • a) 如果在一个类中,有些数据成员的值允许改变,另一些数据成员的值不允许改变,则可以将一部分数据成员声明为const,以保证其值不被改变,可以用非const的成员函数引用这些数据成员的值,并修改非const数据成员的值。
  • b) 如果要求所有的数据成员的值都不允许改变,则可以将所有的数据成员声明为const,或将对象声明为const(常对象),然后用const成员函数引用数据成员,这样起到“双保险”的作用,切实保证了数据成员不被修改。
  • c) 如果已定义了一个常对象,则只能调用其中的const成员函数,而不能调用非const成员函数(不论这些函数是否会修改对象中的数据)。如果需要访问对象中的数据成员,可将常对象中所有成员函数都声明为const成员函数,但应确保在函数中不修改对象中的数据成员。

指向常对象的指针变量

1)指向常对象的指针变量的一般形式


const 类型 *指针变量名

const char *pc; // pc 指向的 char 是const型的
*pa = 'a'; // 错误:pa 指向的目标不能改变
pa++; // 正确, pa 本身的值可以改变


Time t1;
const Time *pt;
*pt = t1; // 错误:pt指向的目标不能改变

2)关于指向常对象的指针变量的说明

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

const int a = 10, b = 20;

const int *pa = &a; // 正确

int *pb = &a; // 错误:非 const 型指针

  • c) 指向常对象(变量)的指针变量除了可以指向常对象(变量)外,还可以指向未被声明为const的对象(变量)。此时不能通过此指针变量改变该变量的值。
pa = &b; // 正确:也可指向非 const 型的变量
*pa = 30; // 错误:指向 const 型的指针不能改目标值
  • d) 指向常对象(变量)的指针变量可以指向const和非const型的对象(变量),而指向非const型变量的指针变量只能指向非const的对象(变量)。


const int *pa = &b; // 正确
int *pb = &a; // 错误
  • e) 如果函数的形参是指向非const型变量的指针,实参只能用指向非const变量的指针,而不能用指向const变量的指针,这样,在执行函数的过程中可以改变形参指针变量所指向的变量(也就是实参指针所指向的变量)的值。

void f(Time *pt);

Time *p1;

const Time*p2;

f(p1); // 正确

f(p2); // 错误

  • f) 如果函数形参是指向const型变量的指针,允许实参是指向const变量的指针,或指向非const变量的指针。


void g(const Time *pt)
Time *p1;
Const Time *p2;
f(p1); // 正确
f(p2); // 正确
  • g) 基本规则:希望在调用函数时对象的值不被修改,就应当把形参定义为指向常对象的指针变量,同时用对象的地址作实参(对象可以是const或非const型)。如果要求该对象不仅在调用函数过程中不被改变,而且要求它在程序执行过程中都不改变,则应把它定义为 const型


对象的常引用

在C++中,经常用常指针和常引用作函数参数。这样既能保证数据安全,使数据不能被随意修改,在调用函数时又不必建立实参的拷贝,可以提高程序运行效率。

例 对象的常引用。


class Time{
public:
 Time(int,int,int);
 int hour;
 int minute;
 int sec;
};
Time::Time(int h,int m,int s)
{
 hour = h;
 minute = m;
 sec = s;
}
void fun1(Time &t) // t 是对象引用
{ t.hour = 18; }
void fun2(const Time &t) // t 为常引用
{ t.hour = 18; // 错误 }
int main( )
{
 void fun1(&);
 void fun2(const Time &);
 Time t1(10,13,56);
 fun(t1);
 cout<<t1.hour<<endl;
 return 0;
}

例3.29 非常对象和常对象的比较。


#include<iostream.h>
class Sample {
public:
 int m;
 Sample(int i,int j){ m=i; n=j;}
 void setvalue(int i){ n=i; }
 void disply()
 {
 cout<<"m="<<m<<endl;
 cout<<"n="<<n<<endl;
 }
private:
 int n;
};
void main()
{
 Sample a(10,20); //若为:const Sample a(10,20);
 a.setvalue(40);//不能修改常对象的数据成员
 a.m=30; //不能修改常对象的数据成员
 a.disply();//常对象不能调用普通成员函数
}

const型数据的小结Time const t = Time(1,2,3);

const Time t = Time(1,2,3);

const int a = 10;

int const a = 10;

  • t是常对象,其成员值在任何情况下都不能被改变。
  • a 是常变量,其值不能被改变

void Time::fun() const;

fun 是Time类的常成员函数,可以调用该函数,但不能修改本类中的数据成员(非mutable)

Time * const pt;

int * const pa;

  • pt 是指向Time对象的常指针,
  • pa 是指向整数的常指针。指针值不能改变。
const Time *pt;
const int *pa;
  • pt是指向Time类常对象的指针,
  • pa是指向常整数的指针,不能通过指针来改变指向的对象(值)

好啦,今天就分享到这啦!喜欢此篇文章或觉得这篇文章对你有帮助的读者可以分享给身边的朋友们。如果你是小白也可以私信回复“资料”领取大礼包一份,以及开发工具一份。

相关推荐

JavaScript基础教程新手入门必看(javascript零基础入门书籍)

对前端稍微有点了解的初学者都知道,JavaScript是必不可少的工具。毫不夸张的说,大部分网页都使用了JavaScript,想要成为一个优秀的前端工程师,做出漂亮令用户满意的网页,熟练掌握JavaS...

初学JavaScript基础知识 掌握JavaScript的组成以及基本语法
初学JavaScript基础知识 掌握JavaScript的组成以及基本语法

为什么学JavaScript?javaScript在网页制作中占有非常重要地位,可以实现验证表单、制作特效等功能,总结起来,学习javascript的目的主要...

2023-03-21 18:26 xiyangw

介绍一下简单易学的编程语言JavaScript(编程 js)
介绍一下简单易学的编程语言JavaScript(编程 js)

#大有学问#JavaScript是一种广泛使用的编程语言,它通常用于在网页中添加交互性和动态内容。JavaScript由Netscape公司在1995年开发,最...

2023-03-21 18:26 xiyangw

前端入门——JavaScript 操作符(前端常用js)

所谓操作符,就是用来操作数据值的符号,在JavaScript中包括算术操作符、位操作符、关系操作符和相等操作符。这些操作符可以操作所有类型的数据,比如字符串、数字、布尔值,甚至对象。一元操作符所谓一元...

带你入门JS的世界,首先需要建立正确的心智模型(一)
带你入门JS的世界,首先需要建立正确的心智模型(一)

转载说明:原创不易,未经授权,谢绝任何形式的转载开篇当我们编写代码时,我们倾向于使用“快速思考系统”,这是一种基于模式匹配和直觉的思考方式。然而,这种思考方式往...

2023-03-21 18:26 xiyangw

10分钟入门javascript函数式编程(什么是函数式编程)

1.函数式编程1.什么是函数式编程函数式编程是?种编程范式,强调使?函数来组合和处理数据。将运算过程抽象成成函数,可以复?。常?的编程范式有:?向过程编程(ProceduralProgrammin...

JavaScript 初学者手册(javascript零基础入门)
JavaScript 初学者手册(javascript零基础入门)

JavaScript是世界上最流行的编程语言之一。我相信这是您第一个绝佳选择的编程语言。我们主要使用JavaScript来创建:网站网络应用使用Node.j...

2023-03-21 18:25 xiyangw

JavaScript零基础入门—JavaScript的BOM(javascript基础入门教程)
JavaScript零基础入门—JavaScript的BOM(javascript基础入门教程)

其实,我们日常开发中,如果不是做前端架构,一般情况下,对BOM的操作其实并不会太多,当然,H5的话也可以借助BOM来定位和判断网络,这个以后再说。对于BOM的操...

2023-03-21 18:25 xiyangw

前端入门——JavaScript 函数(前端function函数的用法)

函数概念说到函数我们首先会想到数学中的函数公式,但是在编程中函数的概念和你想象中的可能有所不同。所谓函数就是一段可以被其它程序引用的代码或程序,可以叫它子程序。函数的作用就是将一个大的系统程序按功能分...

「JavaScript 教程」入门篇-导论(javascript技术教程)

1、什么是JavaScript语言?JavaScript是一种轻量级的脚本语言。所谓“脚本语言”(scriptlanguage),指的是它不具备开发操作系统的能力,而是只用来编写控制其他大型应...

如何快速掌握Javascript入门小知识(造价入门需掌握的知识)

如果你想要学一门语言,那就应该选择Javascript,为什么会这么说呢?因为当前推出的许多新技术都支持这个观点,Javascript作为一种直译式脚本语言,早是在HTML网页上使用,用来给HTML网...

「JavaScript 教程」入门篇-JavaScript 的基本语法

1、语句JavaScript程序的执行单位为行(line),也就是一行一行地执行。一般情况下,每一行就是一个语句。语句(statement)是为了完成某种任务而进行的操作,比如下面就是一行赋值语句。...

Javaweb开发必备,JavaScript技术详解,JS从入门到精通

JavaScript编程语言:1.专门在浏览器编译与执行的编程语言2.帮助浏览器解决用户提出简单需求3.基于面向对象采用弱类型语法风格实现JavaScript学习教程老杜讲解的JavaScript教程...

小白入门篇|前辈多年经验放送:如何学好Javascript
小白入门篇|前辈多年经验放送:如何学好Javascript

首先要说明一下,我不是大神,算是入了JS的门,顶多是半桶水,在这里给大家分享一下我学习js的一些教训。这个时候有人要说,“你丫半桶水,凭啥教我们”。但是大家忘了...

2023-03-21 18:24 xiyangw

前端入门——JavaScript 介绍(前端js基础知识)

JavaScript最早诞生于1995年,当时主要用来处理输入验证操作,随着时间的发展它成为了市面上浏览器必备的一项功能。如今JavaScript不仅仅局限于简单的数据校验,它已经具备与浏览器窗口及...

取消回复欢迎 发表评论: