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

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

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

2.4K10

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是指向对象的地址.所以表示指向对象的地址是个常量

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

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

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

    73830

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

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

    81730

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

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

    47120

    C++基础学习

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

    20930

    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

    38510

    const 和 Object.freeze() 的区别 ?

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

    87230

    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

    44630

    类和对象的提高

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

    28530

    第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; // 正确

    66540

    JS ES5也可以创建常量?🎃

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

    84330

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

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

    18810

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

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

    1.6K10

    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.8K41

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

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

    1.2K20

    不想写表达式的类型?试试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是一个整型常量引 如果是字面值,则必须加上const: const auto &ref...= 10;//10是字面值,常量引用才能绑定字面值 想一想 想想下面推导的size类型是什么?

    43800

    let const 与var的区别

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

    2K30
    领券