- 浏览: 636317 次
- 性别:
- 来自: 苏州
文章分类
最新评论
-
laj12347:
楼主太给力了
Eclipse设置、调优、使用 -
kunlyy:
楼主太给力了
Eclipse设置、调优、使用 -
knight_black_bob:
mark ~
Eclipse设置、调优、使用 -
hujunxiang:
好全好全~~~
Eclipse设置、调优、使用 -
bugyun:
楼主辛苦了
Eclipse设置、调优、使用
c++中的const和java中的final类似, 表示不可变的意思, 但java中的final仅仅用在这几个地方:
(1)修饰变量, 如:
public final int age; // 不可变成员
public static final int TYPE_A = 1; // 常量
(2)修饰方法, 表示方法不可被Override覆盖, 即去除方法的多态性.
(3)修饰局部变量, 也是不可变.
(4)修饰类, 表示类不可被继承
而c++中的const功能就多了:
(1)修饰全局变量: 表示变量值不可修改
Main.cpp
#include <iostream> using namespace std; const int g_int = 10; int main(void) { g_int = 11; cout << "g_int:" << g_int << '\n'; return 0; }
编译的话会得到assignment of read-only variable 'g_int'的编译错误, 表示g_int的值是只读的, 不可修改.
(2)修饰局部变量: 表示变量值不可修改
Main.cpp
#include <iostream> using namesapce std; int main(void) { const int i = 10; i = 11; cout << "i:" << i << '\n'; return 0; }
编译时会得到assignment of read-only variable 'i'的错误, 表示i是只读的, 值不可被修改.
(3)
(3-1)修饰指针变量的值: 表示指针变量的值不可修改, 也这样的变量也可以叫做"指针常量".
(3-2)修饰指针变量所指向的内容: 表示不能修改指针变量所指向的内容, 这样的变量也可以叫做. "常量指针"
Main.cpp
void test( int * const p1, // 指针常量 int const * p2, // 常量指针 const int *p3 // 常量指针 ) { // 修改变量的值 int i = 10; // p1 = &i; // 指针常量, 变量值不可修改 p2 = &i; p3 = &i; // 修改所指内容 *p1 = 10; // *p2 = 10; // 常量指针, 所指内容不可修改 // *p3 = 10; // 常量指针, 所指内容不可修改 } int main(void) { int a = 10; int b = 20; int c = 30; test(&a, &b, &c); }
(4)
(4-1)修饰对象, 表示对象值不可修改
(4-2)修饰对象引用, 也表示对象值不可修改
Main.cpp
struct Data { int m_int; } void test( const Data obj1, Data const obj2, // obj1和obj2的效果相同 const Data &obj3, Data const &obj4 // obj3和obj4的效果相同 // Data & const obj5 // 没有这样的语法 ) { //obj1.m_int = 1; //obj2.m_int = 2; //obj3.m_int = 3; //obj4.m_int = 4; } int main(void) { Data d1; Data d2; Data d3; Data d4; test(d1, d2, d3, d4); return 0; }
会得到编译错误, obj1-4的值均不可修改.
(5)放在方法的返回类型前:
(5-1)修饰基本数据类型的返回值, 如int, char, bool, 没有实际意义, 因为仅仅是一个值, 返回的值赋给某个变量后, 那个变量还是可以被修改.
Main.cpp
#include <iostream> using namespace std; int constMethod() { return 3; } int main(void) { int i = constMethod(); cout << "i:" << i << '\n'; i = 2; cout << "i:" << i << '\n'; }
可以正常编译并运行, 且第一次输出3, 第二次输出2.
(5-2)修饰指针类型的返回值
Main.cpp
class Data { public: int m_int; } class Const { private: Data *m_pt; public: void init(void) { m_pt = new Data(); } void finalize(void) { delete m_pt; } const Data * getPt_01() { return m_pt; } // 返回常量指针 Data const * getPt_02() { return m_pt; } // 返回常量指针 Data * const getPt_03() { return m_pt; } // 返回指针常量 } int main(void) { Const c; c.init(); // error: invalid conversion from 'const Data*' to 'Data*', 常量指针无法赋值给普通指针, 因为普通指针可以修改指针所指内容, 而常量指针不可以 // Data *pt_01 = c.getPt_01(); // Data *pt_02 = c.getPt_02(); Data *pt_03 = c.getPt_03(); // 下面3个都可以 const Data *pt_04 = c.getPt_01(); const Data *pt_05 = c.getPt_02(); const Data *pt_06 = c.getPt_03(); c.finalize(); return 0; }
(5-2)修饰引用类型的返回值
Main.cpp
class Data { public: int m_int; } class Const { private: Data m_obj; public: const Data & getObj_01() { return m_obj; } Data const & getObj_02() { return m_obj; } //Data & const getObj_03() // 没有这样的写法 } int main(void) { Const c; Data d_01 = c.getObj_01(); Data d_02 = c.getObj_02(); const Data d_03 = c.getObj_01(); const Data d_04 = c.getObj_02(); return 0; }
(6)放在方法的最后: 表示该方法不会修改对象的数据
Main.cpp
class Const { private: int m_int; public: void setInt(int i) const { m_int = i; } } int main(void) { Const c; // c.setInt(2); return 0; }
会得到编译错误, error: assignment of member 'Const::m_int' in read-only object, 提示在只读方法上对变量m_int直行了赋值.
(5)修饰类成员变量: 表示成员变量值不可修改
Const.h, 注意const变量只能在初始化列表上进行初始化, 在构造器内部是不行的(那时c++编译器不认为是初始化了, 而是属于赋值阶段了)
#ifndef CONST_H_ #define CONST_H_ class Const { private: const int m_int; public: Const(int i); void setInt(int i) { // error: assignment of read-only member 'Const::m_int' // m_int = i; } } #endif
Const.cpp
Const::Const(int i) : m_int(i) { }
Main.cpp
#include "Const.h" int main(void) { Const c(1); c.setInt(2); return 0; }
Const.h会得到编译错误: error: assignment of read-only member 'Const::m_int', 提示m_int的值是只读的, 不可修改
(6)修饰类的static变量: 表示static变量值不可修改
Const.h
#ifnded CONST_H_ #define CONST_H_ class Const { private: static const int s_int; public: static void setInt(int i) { // error: assignment of read-only variable 'Const::s_int' //s_int = i; } } #endif
Const.cpp
const int Const::s_int = 10;
Main.cpp
#include "Const.h" int main(void) { Const c; c.setInt(11); Const::setInt(12); return 0; }
Const.h会遇到编译错误, error: assignment of read-only variable 'Const::s_int', 提示s_int是只读的, 其值不可修改.
发表评论
-
c++ #include 类互相包含问题
2014-02-21 10:24 3486A.h文件 #ifndef _A_H_ #define ... -
c++ 引用的几个错误用法
2013-11-20 17:42 1857[size=medium] (1):返回临时变量的引用。 ... -
javaer学c++: template的简单使用
2013-11-03 23:51 0[size=medium][/size] -
javaer学c++: 总是将析构函数写为可重写
2013-11-03 23:50 0占坑!!!!! -
javaer学c++: 类的数组成员的初始化
2013-11-03 23:49 0占坑!!!!! c++中数组成员的初始化真麻烦, 需要借助 ... -
javaer学c++: struct
2013-11-03 23:48 0除了作为函数参数的封装, 其它的用法在c++中都被类所替代了 ... -
javaer学c++: c++中的类型转换
2013-11-03 23:45 0c++中的类型转换又要啃爹了, 又分为了n个迷惑人的方式 -
javaer学c++: 数组指针, 指针数组
2013-11-03 23:44 0占坑!!!!! -
javaer学c++: 函数指针
2013-11-03 23:44 0占坑!!!!! -
javaer学c++: 容器map的使用
2013-11-03 23:43 0占坑!!!!! -
javaer学c++: 容器set的使用
2013-11-03 23:43 0占坑!!!!! -
javaer学c++: 容器vector的使用
2013-11-03 23:42 0占坑!!!!! -
javaer学c++: c++编译器会帮我们自动生成的5个方法
2013-11-03 23:42 0占坑!!!!! -
javaer学c++: 继承
2013-11-03 23:38 0c++中的继承又是一个特别坑爹的地方, 有哪些坑爹点呢? ( ... -
javaer学c++: 函数参数默认值
2013-11-03 23:37 0占坑!!!!! -
javaer学c++: 条件编译
2013-11-03 23:36 0占坑!!!!! -
javaer学c++: 宏
2013-11-03 23:35 0占坑!!!!! -
javaer学c++: virtual关键字
2013-11-03 23:34 0占坑!!!!! -
javaer学c++: c++中的枚举
2013-11-03 23:34 0占坑!!!! -
javaer学c++: c++中的类
2013-11-03 23:29 1074这个和java中的类类似, 仅仅是写法上有些区别, 以及类的 ...
相关推荐
javaer-roadmap Github上已经有很多 java及周边技术的优秀项目,发现深度有余,广度不足。所以本项目不在深度上继续扩展,而在广度上给大家分享一些当前职场火热的技术导航。其中包括相关的、书籍、资料、网站等。...
toBeTopJavaer,成为Javaer-JavaSouthType.zip
成为顶尖Javaer - Java工程师成神之路 主要版本 更新时间 备注 v4.0 2022-05-20 知识体系完善,知识点补充 v3.0 2020-03-31 知识体系完善,在v2.0的基础上,新增20%左右的知识点 调整部分知识的顺序及结构,方便...
讲述如何在程序中避免程序缺陷和程序陷阱的,解惑的过程中,介绍了一些Java编程语言中许多不易被掌握的知识点,其阅读价值非常高,适合具有Java知识的学习者和有编程经验的Java程序员阅读。
标题中的"Gmail API for Java"指的是使用Java编程语言与Google的Gmail服务进行交互的一系列API接口。...通过Java中的Gmail API,我们可以实现自动化邮件处理、邮件通知、邮件分析等多种功能。 ...虽然描述本身为空,但...
Java提供了丰富的并发工具,如线程池、synchronized关键字、volatile、ThreadLocal、Lock等,学习者需了解它们的用法及背后的内存模型,以编写高效、安全的并发代码。 3. **Java虚拟机(JVM)**:JVM是Java程序运行...
【软工1503-Javaer 集-信息盾-用户需求说明书-V1-201909281】文档描述了一个旨在保护快递业务中用户隐私的项目——"信息盾"。该项目主要关注如何在快递过程中保护用户的个人隐私信息,如姓名、电话和地址等,以防止...
成为Javaer的榜首-Java工程师成神之路主要版本更新时间备注v3.0 2020-03-31知识体系完善,在v2.0的基础上,再增加20%左右的知识点调整部分知识的顺序及结构,方便阅读和理解通过GitHub Page构建,方便阅读v2.0 2019...
《电子日记本设计与实现-用户需求说明书》 在当今数字化时代,电子日记本逐渐取代了传统的纸质日记,成为人们记录生活、表达情感的新选择。本文档详细阐述了一个专为安卓用户设计的电子日记本软件的开发需求,旨在...
互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术...
java8 源码 点击关注及时获取笔主最新更新文章,并可免费领取本文档配套的《Java面试突击》以及Java工程师必备学习资源。 作者的其他开源项目推荐: : 适合新手入门以及有经验的开发人员查阅的 ...
《电子日记本设计与实现:用户需求详解》 在当今数字化时代,传统的纸质日记已无法满足用户多样化的需求。为了适应这种变化,一款集文字、图片、声音于一体的智能电子日记本应运而生。本文将详细阐述这款针对安卓...
《电子日记本》需求规格说明书详述了设计和实现一个针对安卓移动设备用户的电子日记本系统的需求。该系统由用户组成员提出,由开发组成员负责开发。文档旨在为开发、测试、需求评审等团队提供清晰的需求说明和逻辑...
leetcode下载 路漫漫其修远兮 吾将上下而求索 1.基本介绍 该项目为平时总结的技术资料和工具使用以及面试总结。 1.1.面试资料 ...Javaer - Java工程师成神之路 https://github.com/hollischuang/toBeTopJavaer
通用语言 Java程序员编写的类似common-lang工具包包名就是要用大驼峰,不想改成go规范的包名。... string)布尔IsAnyEmpty(list ... string)布尔IsAnyNoneEmpty(list ... string)布尔IsBlank(str字符串)bool ...
后端javaer的福音!这是一个基于vue-element-admin的基础模板vue-admin-template改造+简化而来(例如,加入了标签导航,国际化等等),可以让非专业前端的javaer快速上手的前后端分离项目(前端部分),相信你在日常开发...
《toBeBetterJavaer-master》这份压缩包文件,是专为Java初学者和进阶者精心打造的学习资源。...无论你是Java新手还是希望进一步提升的开发者,这份资料都能提供丰富的学习资源,助你成为更出色的Javaer。
`goto`是C/C++中的一个关键字,用于无条件跳转。Java设计者出于安全考虑,未将其纳入Java语言。 - **替代方案**: 使用`break`或`continue`来控制循环。 **1.3 `&`与`&&`的区别** - **知识点**: `&`是位运算符,用于...
4.作为一个地道的javaer+Androider,希望可以为想入坑Flutter的朋友铺条小路 5.整个7篇文章贯穿着我学习的心+思,基本上敲一段测试代码,写一段文章。对我的学习方式也是一种记录与沉淀 七篇文章如下: 下面是一边...
Javaer - Java工程师成神之路 主要版本 更新时间 备注 v1.0 2019-04-10 首次发布 一、基础篇 面向对象 什么是面向对象 平台无关性 值传递 封装、继承、多态 Java基础知识 基本数据类型 自动拆装箱 String类 熟悉Java...