首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++中变量声明与定义规则

这种在文件中进行静态声明做法是从C语言继承而来,在C语言中声明为static全局变量在其所在文件外不可见。这种做法已经被C++标准取消了,现在替代做法是使用匿名命名空间。...允许常量引用绑定非常量对象、字面值甚至一般表达式 一般而言,引用类型必须与其所引用对象类型一致,但是有两个例外: 初始化常量引用时允许用任意表达式作为初始值,只要该表达式结果能转换成引用类型即可,...允许为一个常量引用绑定非常量对象、字面值甚至是一个一般表达式(如下) 可以将基类指针或引用绑定到派生类对象上(后续面向对象章节再探讨) int i = 10; const int &ri1 = i...顶层const与底层const 指针本身是一个对象,因此指针本身是不是常量与指针所指对象是不是常量是两个独立问题,前者被称为顶层const,后者被称为底层const。...顶层const用于表示任意对象是常量,包括算数类型、类和指针等,底层const用于表示引用和指针等复合类型基本类型部分是否是常量

2.3K10

1.C和C++区别,以及const分析(底层const顶层const)

所以编译途中遇到使用const变量时,则直接从符号表中取出常量. 只要当该const变量为全局(使用extern声明过),或者被使用&操作符时,才会被分配存储空间....这是因为使用&c时,会从符号表中取出c值,并将0存在一个新分配空间地址里,所以*p修改只是分配出来空间地址内容,而c还是常量. 3.2 const和define区别 是不是感觉C++中const.... 3.3 指针const 指针const分为两种: 底层const, 顶层const (普通变量const(或引用)永远是顶层const,也就是说,const int 和int const本质都一样...其实很好理解,比如 const int *p, 修饰*p是个const常量.而*p是指向对象内容.所以表示指向对象内容是常量 但是可以通过其它方式修改内容,例如: int a=1,b=3; const...(位于*右侧) 指针常量,表示不能更改指针指向地址,只能修改其内容(定义时必须被初始化) 其实很好理解,比如 int * const p, 修饰 p是个const常量.而 p是指向对象地址.所以表示指向对象地址是个常量

83120
您找到你想要的搜索结果了吗?
是的
没有找到

【译】const和Object.freeze()在JavaScript中区别

原文链接:https://alligator.io/js/const-vs-obj-freeze/ 使用对象最常用目的是为了保持状态 - 例如配置数值或者你应用要用到常量。...它们通常是全局变量(这样就不再需要把它们作为函数参数传递),但全局变量是不安全,因为它们可以被接收函数所改变。...an error return alligatorColor; } 这里会抛出"类型错误:向常量分配值",const已经使得alligatorColor不可变。...所以这意味着const并不是使变量值不可变,而是使变量绑定不可变。这意味着不允许重新赋值变量,但const变量引用值仍然可能会发生变化。...); // true 现在我们知道在程序中使用全局变量来管理状态并不是很好做法

72230

ES6常用新特性学习1-let和const

但是在全局函数内用一对花括号包裹区域中生命变量b,却可以在全局中直接引用。因为对于JS来讲,是没有块作用域。这一点和JAVA等语言有着很大不同,也带来了很多不便。...这个很好理解。但如果此时该变量在块作用域外部也被声明了呢?是否此时引用是对外部该变量引用呢?...3. const const作用很简单。const声明一个只读常量。一旦声明,常量值就不能改变。...在代码中,我们将长会将一些常量用一些有实际意义名称去命名。比如上面代码段中圆周率PI。 const声明变量不得改变值,这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值。...但对于复合类型数据(主要是对象和数组),变量指向内存地址,保存只是一个指针,const只能保证这个指针是固定,至于它指向数据结构是不是可变,就完全不能控制了。

44320

C++核心准则C.60: 拷贝赋值运算符应该是以const&为参数,返回非常量引用类型非虚函数

: 拷贝赋值运算符应该是以const&为参数,返回非常量引用类型非虚函数 Reason(原因) It is simple and efficient....如果你希望对右值优化,提供一个使用&&(右值引用)重载。...考虑用于(元素,译者注)大小相同巨大Vector赋值简单Vector场景。在这种情况下,通过swap技术实现元素拷贝动作将引起成本大幅度增加。...如果你认为你需要一个虚赋值操作运算符,而且理解它会产生很深刻问题,别把设计成赋值运算符。将它定义为具名函数,例如virtual void assign(const Foo&)。...不要改成类似const T&类型,这样会影响组装性并妨碍将对象放进容器中。

80030

C++基础学习

基础概念全局变量在所有函数外部定义变量(通常是在程序头部),称为全局变量。全局变量值在程序整个生命周期内都是有效。...程序中,局部变量和全局变量名称可以相同,但是在函数内,局部变量值会覆盖全局变量全局变量可以被任何函数访问。也就是说,全局变量一旦声明,在整个程序中都是可用。...a + b; cout << g; return 0;}常量定义把常量定义为大写字母形式,是一个很好编程实践。...在 C++ 中,有两种简单定义常量方式:使用 #define 预处理器。#define identifier value使用 const 关键字。...WIDTH 5引用引用很容易与指针混淆,它们之间有三个主要不同:不存在空引用

19030

ES6笔记(2)-- let块级作用域

var i = 1; i <= 10; ++i) { a[i] = function() { return i; }; } a[3]() // 11 循环中变量i是处于全局作用域下...,其实这里是个闭包,函数内部i与函数外i形成了引用关系,导致函数退出之后i未被销毁,引用依然是全局i 循环完成,此时i已经是11,调用之,则值皆为11 二、块级作用域 1. let简单使用...bb = 1; let bb = 2; // Uncaught SyntaxError: Identifier 'bb' has already been declared 2)不存在变量提升,如下做法会报错...)(); 但或许现在不再需要了,直接使用一对(或多对)大括号,就有了块级作用域 { console.log(1); // 1 } 4. const常量声明 const声明了一个只读常量常量...declaration 2) const声明引用类型 const声明引用类型,只是引用类型地址不能更改,但其指向值是可以,如 const obj = { a: 10 }; obj.a

37110

const 和 Object.freeze() 区别 ?

这篇文章介绍了使用const和Object.freeze()在 JS中定义常量和配置值一些做法,以及它们之间区别。 当我们在 JS 应用程序中定义常量和配置值时。...在上面的示例中,函数getApplicationName()更改了APP_NAME值。 我们要如何防止全局变量被更改?...使用 const 我们可以使用 const 来定义,这样全局变量就不会被更改到?...从上面的两个例子中可以看出,即使使用const,也可以改变数组或对象值。 const 不是使用变量值不可变,而是变量引用地址来可变。...Object.freeze() 忽略对象或数组值更改 把它们组合在一起将防止更改对象或数组引用和值 一起使用 const 和 Object.freeze() const constants = Object.freeze

85730

C++中引用处理

目录 1.引用基本用法 1.1 引用实质 1.2 引用用法  2.函数中引用 3.引用本质 4.指针引用 5.常量引用 ---- 1.引用基本用法 引用是C++对C重要扩充。...*x; *x = *y; *y = temp; } void test01() { int a = 10; int b = 20; swap(&a,&b); } 在C++中可以也使用引用很好解决这个问题...= tmp; } void test01_ref() { int a = 10; int b = 20; swap_ref(a, b); } 如果想开辟数组地址,用指针做法是...  get_mem(&p);   get_mem_ref(p); } 5.常量引用 const type &p = q; 常量引用代表不能通过引用去修改引用标识那块空间 int a =...10;  const int &b = a; 如果你再去  让 b = 1000;就是错误  虽然不能引用常量,但是可以加const引用 int &b = 100; //不能引用常量 改为 const

42630

类和对象提高

**因此静态成员不需要通过对象就可以访问** 访问静态成员 1.类名::成员名 2.对象名.成员名 3.指针->成员名 4.引用.成员名 静态成员变量本质上全局变量,静态成员函数本质上是全局函数 例如...,考虑一个随时知道矩形总数和总面积图形处理程序 可以用全局变量或者静态成员变量来表示,但考虑不同 结构体中定义中,将w,h定义长宽,当出现一个对象时候(**在构造函数里完成**),总数变量加1,面积变量也是增加...(被称为成员对象),这个类叫封闭类) 任何生成封闭类对象语句,都要让编译器明白,对象中成员对象是如何初始化 具体做法是:*通过封闭类构造函数初始化列表 *封闭类构造函数和析构函数执行顺序 1...常引用 如果不希望某个对象值被改变,则定义该对象前可以加上const 可以在类成员函数后面加上const关键字,则为常量成员函数 *常量成员函数执行期间不应修改其所作用对象(成员对象,成员函数)...例如:void getvalue() const; //声明 注意*常量对象不能执行非常量成员函数,可以执行常量成员函数 #友元 友元分为友元函数和友元类两种 友元函数:一个类友元函数可以访问该类私有成员

27130

第2章 变量和基本类型

2)利用一个对象去初始化另一个对象,它们是不是 const都无关紧要,如 1 int i=42; 2 const int ci = i; // 正确,值拷贝 3 int j = ci;...4)对 const引用。     4-1.允许为一个常量引用绑定非常量对象、字面值,甚至是一个一般表达式,而类型也没有硬性要求,只要能成功类型转换即可。...*const p = π // 指向常量常量指针,靠左是底层const,靠右是顶层const,也必须进行初始化 5-2.执行拷贝操作,顶层const没有影响,拷入和拷出对象是否是常量都没什么影响...然而底层const限制却不能忽略,非常量可以转化成常量,反之则不行。     5-3.常量表达式,不改变,且编译时就知道结果。...&g = ci; // g是一个整型常量引用 8 auto &h = 42; // 错误,不能为非常量引用绑定字面值 9 const auto &j = 42; // 正确

65440

JS ES5也可以创建常量?🎃

本文简介 ES6 刚推出时候,let 和 const 应该是大多数人学习 ES6 第一个知识点。 其中 const 可以用来定义 常量 ,将不需要改变数据定义成一个常量。...ES 5 创建常量 Object.defineProperty 基础用法 在 ES6 之前是没有 const ,如果需要定义常量,可以使用 Object.defineProperty 。...顺着上面的思路,如果我们把 LH 改成 window ,那是不是就可以在 window 上定义一个属性,而且该属性是全局,定义后在什么地方都能调用。...常量居然可以修改值? 上面创建常量,value 是一个基础数据类型值。如果换成引用类型值,那内容是可以修改。...但定义引用类型时,内存地址存引用地址。所以常量定义指的是引用地址不能修改。 兼容性 使用 Object.defineProperty 定义常量时需要注意兼容性

81430

C++面试知识总结

2.3 const和define用途以及区别 const用途:用来定义常量、修饰函数参数、修饰函数返回值,可以避免被修改,提高程序健壮性。...2.11 字符指针,浮点数指针和函数指针哪个占用内存更大 一样大,指针占用内存大小只和机器相关。 2.12 如何引用一个全局变量 在同一文件中:直接引用。...2.15 常量指针和指针常量区别 常量指针:是一个指向常量指针。可以防止对指针误操作而修改该常量。 指针常量:是一个常量,且是一个指针。...2.18 static全局变量与普通全局变量区别 全局变量在整个工程文件内都有效。 静态全局变量只在定义它文件内有效。 全局变量和静态变量如果没有手工初始化,则由编译器初始化为0。...正确做法:p = (char *)((int *)p + 1);。 3. 面向对象知识 3.1 面向对象三个基本特点 封装:将客观事物抽象成类,每个类对自身数据和方法。

1.7K41

【C→C++】打开C++世界大门

是不是不太好啊,人家故意把这些东西封到命名空间中来防止命名冲突,我们这样直接全局展开的话是不是命令空间存在就没什么意义了。 我们不小心再定义一个同名变量啥是不是就出现问题了。...缺省值必须是常量或者全局变量(一般不用全局变量) C语言不支持缺省参数(编译器不支持) 5. 函数重载 自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实含义,即该词被重载了。...但是现在我们想要给它起一个别名(引用)y,而y是没有被const修饰,也就是说y是可以被改变,但是它引用实体却是不可变。 这是不是相当于给它权限放大了,所以这样不行。...补充:C++中建议用const和枚举enum代替宏定义常量 从宏这些优缺点出发,C++又引入了一个新概念——内联函数。 7.1 概念 那什么是内联函数呢?...所以要想NULL调用第二个函数: 在C++98中,字面常量0既可以是一个整形数字,也可以是无类型指针(void*)常量,但是编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用

14910

不想写表达式类型?试试auto吧

非也,我们知道C语言中其实也有auto关键字,它和早期C++中auto关键字一样,它修饰局部变量,表示自动存储期(更多内容也可以阅读《全局变量,静态全局变量,局部变量,静态局部变量》)不过由于默认就是这种...= vec.end();++it) { std::cout<<*it<<std::endl; } return 0; } 是不是简洁了许多?...通常auto会忽略掉顶层const(本身是常量,如int *cosnt p),而会保留底层const(指向对象是常量,如const int* p)。...当然auto还可以设置引用类型,例如: const int ci = 10; auto &cp = ci;//cp是一个整型常量引 如果是字面值,则必须加上constconst auto &ref...= 10;//10是字面值,常量引用才能绑定字面值 想一想 想想下面推导size类型是什么?

41600

让天下没有难学js之JavaScript中变量那些事,知识点超多

const const 关键字是ES2015(ES6) 新增加重要 JavaScript 关键字,用法和 var 一样,只不过 const 生成是一个或多个常量,在有些时候,我们定义值不希望被覆盖或者修改...其实const声明常量并非严格意义上常量,因为当我们用const定义一个常量值为引用类型(下面会讲基本类型和引用类型)时候,虽然我们不能进行重新赋值,但我们可以修改引用类型值。...b,这时候a和b其实指向是一个对象,所以当我们修改其中任何一个时候,都是在对同一对象进行修改 这样很好解释了我们上面所说const定义常量可修改问题,当我们用const定义常量为对象时,其实我们在这个常量里保存只是一个对象地址...,无论我们怎么修改这个对象,const定义常量里保存地址是没有变化,所以上面例子中对const定义对象进行修改其实并没有违背const定义变量不可修改原则,只有我们给这个常量重新赋值一个新对象...(也就是新地址)时候,才会触发const定义常量不可修改规则。

1.1K20

CC++常见面试知识点总结附面试真题—-20220326更新

C中,内存分为5个区:堆(malloc)、栈(如局部变量、函数参数)、程序代码区(存放二进制代码)、全局/静态存储区(全局变量、static变量)和常量存储区(常量)。...补充: 1). c中局部const常量存储在栈空间,全局const常量存在只读存储区,所以全局const常量也是无法修改,它是一个只读变量。 2)....5 ). c++中只有用字面量初始化const常量会被加入符号表,而变量初始化const常量依然只是只读变量。...,由于c++中const常量值在编译期就已经决定,下面的做法是OK,但是c中是编译通不过。...:)结果仅仅可以作为右值,比如如下做法在C编译器下是会报错,但是C++中却是可以是通过。这个进步就是通过引用来实现,因为下面的三目运算符返回结果是一个引用,然后对引用进行赋值是允许

1.5K10

let const 与var区别

es6里面的一些新特性还是很好,但是有的时候看文档会带来一些疑惑。let、const这两个东西和var到底有哪些不同呢?下面咱们结合一些小例子给大家展示一下。...明白了原理就好改造了,既然定时器回调函数中i每次都是从全局作用域中取值,能不能在循环时候将其放到局部作用域中呢,当然可以看代码: ? 执行结果为: ? 那这些和let有什么关系呢?...下面是const与var不同,以上三点完全适用const,但是const与let或是var还有两点不同。 首先是第一点,const是用来定义常量常量定义之后是不允许改变。看代码: ?...因为a值并没有改变,依然指向刚开始赋值那个对象,并为重新赋值,如果将a重新赋值,就会报错了。大家可以试试。用const定义常量只要是引用类型数据,改变这个引用类型数据结构或属性,都是允许。...引用类型包括哪些呢?数组和对象。 第二点是用const定义常量必须赋值。不赋值的话,没有任何意思,所以报错,看代码: ? 执行结果为: ?

1.9K30
领券