首页 > 其他分享 >cpp:const引出的那些事

cpp:const引出的那些事

时间:2024-03-14 17:11:20浏览次数:23  
标签:const 常量 指向 引出 int cpp SIZE 指针

1.常变量

  const int i = 10;    
  int const i = 10;

两种表达方式没区别

2.指针与const

  • 如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;
  • 如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。
  • 利用英文从右边往左边读,并且以to为分界,to之前为描述指针的特性,to之后为描述目标的特性

指针常量: 指向常量的指针

const int *a;
int const *a;

1.对于指向常量的指针,不能通过指针来修改对象的值。
2.不能使用void*指针保存const对象的地址,必须使用const void*类型的指针保存const对象的地址。
3.允许把非const对象的地址赋值给const对象的指针,如果要修改指针所指向的对象值,必须通过其他方式修改,不能直接通过当前指针直接修改。
eg:
    const int p = 10; //定义一个常量
    const void * vp = &p;//将这个常量地址付给这指向常量的指针
	int val = 3;
	ptr = &val; // ok,指针可以改变自己的指向
	*ptr=4;//error,不能通过指针来修改对象的值

常指针:const指针不能修改指向

int* const a;

eg:
    int num=0, num1=1;
    int * const ptr=# // const指针必须初始化!且const指针的指向不能修改
    ptr = &num1; // error! const指针不能修改指向!
	*ptr=1;//ok,const指针指向的值能修改

指向常量的常指针

const int* const a;

3.类函数中的const

const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数.

int Apple::add(int num) const
int Apple::add(int num) 
  • Apple对象可以访问add()和add() const;
  • const Apple对象只能访问add() const;

在一个类中,任何不会修改数据成员的函数都应该声明为const类型。如果在编写const成员函数时,不慎修改 数据成员,或者调用了其它非const成员函数,编译器将指出错误,这无疑会提高程序的健壮性

类中常量

不能在类声明中初始化 const 数据成员。以下用法是错误的,因为类的对象未被创建时,编译器不知道 SIZE 的值是什么。(c++11标准前)

class A 
{
  const int SIZE = 100;   // 错误,企图在类声明中初始化 const 数据成员 
  int array[SIZE];  // 错误,未知的 SIZE 
};
根本原因:const的生命周期在对象A创造之前是不存在的。

正确做法

class A 
{
  A(int size);  // 构造函数 
  const int SIZE ;    
}; 
A::A(int size) : SIZE(size)  // 构造函数的定义
{ 

} 
A  a(100); // 对象 a 的 SIZE 值为 100 
A  b(200); // 对象 b 的 SIZE 值为 200 

cosnt static 常量 可以解决生命周期的问题

标签:const,常量,指向,引出,int,cpp,SIZE,指针
From: https://www.cnblogs.com/getonechao/p/18073308

相关文章

  • Qt "QWidget: Must construct a Qapplication before a Qwidget"错误
    问题该错误信息表示在创建QWidget(窗口部件)之前必须先创建QApplication(应用程序)。这是因为QApplication在创建QWidget之前会进行一些初始化操作,确保正确运行应用程序。要解决这个错误,您需要在创建QWidget之前先创建QApplication。以下是处理该错误的常见方法:1.在......
  • Qt 解决:QWidget: Must construct a QApplication before a QWidget
    在调试vlc-qt的examples工程时,遇到编译报错“QWidget:MustconstructaQApplicationbeforeaQWidget”根据字面理解应该是,创建窗体前应该必须先构造一个QApplication。网上很多人也遇到过这样的问题,也确实是这个原因,如下:但是本人遇到的问题却不是这个,最后查找......
  • cpp website资源汇总
    社区purecpp:acoolopensourcemodernc++communitytotw:C++TipsoftheWeekhackingC++:BestC++ProgrammingBlogsin2023TheBestBlogsandWebsitesThemostinterestingblogsandwebsitesforC++developers/HabrCPlusPlusThings:C++那些事参......
  • Qt QWidget Must construct a QApplication before a QWidget
    1,有些QT写的PC程序在运行的时候,会弹出下图所示的错误提示框 2、原因是因为,在点击程序的关闭的时候,有其它的窗口没有关闭,再次打开造成的,如下图所示,可能的原因是程序启动后,在任务栏在两个图标 3、如下图所示,用鼠标点击关闭其中一个窗口,另一个窗口并没有关闭4、当你再次打开......
  • Qt QWidget: Must construct a QApplication before a QWidget
    在使用UI的qwidget之前都必须先构造一个QApplication实例,这是断言的意思。错误的可能是在哪个类中采彩用了静态的(static)的qwidge域或其子类,因为静态和全局对象进入main函数之前就产生了,所以早于main函数里的qapplication日对象,所以出现了此断言错误。解决方法是避免在......
  • Qt 报错: QWidget: Must construct a QApplication before a QWidget
    最近遇到一个问题,程序编译时出现报错:Mustconstructa QApplication beforeaQWidget。我的main.cpp有这样的代码1intmain(intargc,char*argv[])2{3QApplicationa(argc,argv);4}另外一个SS.h1classSS:publicQWidget2{3Q_OBJECT4public:......
  • 7-hard_constraints
    Initiallywe’lllookatthemostcommonhardconstraint—collisionsandcontactbetweenobjects.Alltheengineswe’rebuildinginthisbooktreathardconstraintsdifferentfromforcegenerators.Attheendofthebook,we’lllookbrieflyatalternativeapp......
  • [C++]c++ 在项目cpp文件中直接用#pragma comment语句引入,无需配置属性表
    使用语句添加引入库的好处就是无需配置多个属性表,不管是debug模式还是release模式,不管是64位还是32位,几行代码通吃。相对路径:#ifdef_M_X64#pragmacomment(lib,"../../../VC++/DVPCamera64.lib")#else#pragmacomment(lib,"../../../VC++/DVPCamera32.lib")#endif绝......
  • const的用法
    1、修饰局部变量constintn=5;intconstn=5;这两种写法都是一样的,都是表示变量n的值不能被改变了!但在用const修饰前,一定要给变量初始化!否则就不能再进行赋值了。2、修饰指针与指针常量2.1常量指针常量指针是指针指向的内容是常量。constint*n;intconst*n;数据......
  • 郑莉cpp习题7-11
    代码#include<iostream>usingnamespacestd;classBaseClass{public:voidfn1();voidfn2();};voidBaseClass::fn1(){cout<<"调用基类的函数fn1()"<<endl;}voidBaseClass::fn2(){cout<<"调用基类的函数fn......