C++ 重点关键字
final
用于类后或者函数后,声明该类/函数,不可被继承/覆盖。
例如:
1. class Base final {...} //不能作为基类,即禁止继承
2. void print const final; //函数声明,禁止函数被覆盖(多用于类继承)
override
用于声明某函数是覆盖覆盖基类虚函数
例如:
class Base {
public:
virtual void get() const;//基类虚函数
};
class Son :public Base {
public:
void get() const override; // 表明该函数是覆盖基类同名虚函数智勇,便于检查继承覆盖函数的正确性。
}
auto 和 decltype
二者都用于类型推导,不同的是
1. auto将赋值语句右值计算后赋给左值(变量),所以它是实实在在执行了右值表达式;而decltype则是用某表达式/变量的返回值/推导值,来声明变量,它不执行语句。
例如:
int m = 1;
auto i = m + 2; m+2 执行后结果为int,所以i被声明为int
decltype(m + 2) i = 10; 这里编译器只是分析 “m+2”表达式结果类型为int,而没有执行m+2;
2. auto忽略顶层const,而decltype会保留。
3. decltype((变量))的结果是引用,而decltype(变量)结果是变量类型。
const
四种用法
1.修饰变量起到限定只读作用;
void func(const int a, const string str)
{...}
const int* func(...)
{...}
2.const int* p : 不能通过指针p去修改对象的值。但对象本身可以被赋值。
3.int* const p : 指针不可变
4. void func(...) const
{...}
保证本段函数不修改调用它的对象,或者常量对象可以调用本函数,或者对象在本段函数内是安全的。
那么const int* func(const int, const string&, const char*) const &/&&
{...}这又该怎么解读呢?自己去探索吧!
特点:被修饰常量不可改值(只读);有类型检查;通常保存在符号表中,不分配内存;效率高;
与#define的区别:宏只是机械替换,不做类型检查;使用多少次(赋值),就查找多少次内存,效率低;const可以修饰指针,宏不可以;const可以控制在函数内部值不可变。
extern
置于变量或者函数前,表示定义在别的文件中。提示,遇到次变量或函数时,在别处寻找定义。或者:多文件共享变量。
extern "C"---调用C代码(需要按照C规则编译);
operator
用于重载运算符时
TYPE operator 运算符(形参...)
{
......
}
sizeof
sizeof(对象)
sizeof(变量或者表达式)
struct大小计算 (字节对齐)
结构体顺序存储,为了加快CPU的取数速度,编译器会对结构体进行处理。让基本数据类型的数据处于能被其大小整除的地址上。比如int型,第一个存在 4-8地址 ,中间有一个char 在8-9地址,那么下一个int 在12-16,中间的10-11就需要字节填充。这样一来,结构体的sizeof就会增大。
字节对齐准则
1. 结构体变量的首地址能够被其最宽基本类型成员的大小所整除。
2. 结构体的每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要,编译器会在成员之间加上填充字节(internal adding)。
3. 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要,编译器会在最末一个成员后加上填充字节(trailing padding)。
空结构体大小1字节,用于占位。简单例子
struct
{
char c;
int i;
double d;
short s;
}1+填充3+4+8+2=18? 8的倍数=24
我们来看一个嵌套的例子
struct stu
{
short i;
struct
{
char c;
int j;
} ss; //嵌套时,要注意内嵌的struct首地址仍然要整除内部最大类型大小
int k;
}2+填充2+1+填充3+4+4=16
#include <iostream> struct stu
{
short i;
struct
{
char c;
int j;
} ss; //嵌套时,要注意内嵌的struct首地址仍然要整除内部最大类型大小
int k;
}s1; struct
{
char c;
int i;
double d;
short s;
}s2; int main()
{
std::cout << sizeof(s1) << " " << sizeof(s2) <<std::endl;
return ;
}C++ code
union的sizeof
联合体重叠式存储,成员共享一段内存。
sizeof(union) = max(sizeof( union(i) )
数组的sizeof
1.字符串,多一个'/0'
2.当数组为形参时,大小相当于指针sizeof,大小即地址=计算机内部地址总线的宽度(32位4B, 64位8B)
3.函数,返回值的大小
static
静态数据成员属于类,而非对象,一个类只有一份;
静态成员函数属于类,而非对象,不能使用this指针来访问,只能访问静态数据和静态成员函数;
静态数据成员,必须在类外进行初始化,初始化使用作用域运算符标明所属类;
如: int Demo::staticVName = 1;
有时候,我们为了比避免父类的静态变量影响子类,可以在子类中定义一个与父类相同的static变量。这不会引起错误,因为有name mangling存在。(会对重载的变量和函数进行处理,以达到区分的目的)
另外,static关键字还有以下作用
隐藏(只在本文件、函数中可见)
保持变量的持久化(函数中的static变量可以持久化,且可以控制可见范围)
void testStatic()
{
static int m = ;
cout << "函数被调用:" << m << endl;
m--;
} int main()
{
for (int i = ; i < ; ++i)
testStatic();
cout << m << endl;//错误,main函数不可见 m
}默认初始化为0
new 与 malloc
new:C++运算符;new-delete;使用简单,不计算大小,不需要类型转换;自动调用构造、析构函数;内存申请失败,抛出异常;不能进行重新分配;进行类型检查;可设置内存分配器;
malloc:C语言标准库函数;malloc-free; 需要计算大小,需要显示类型转换;不调用;申请失败,返回NULL; 可利用relloc重新分配内存;不检查类型;不可设置内存分配器。
union
用union类型测试大端小端存储
参考资料
https://blog.csdn.net/yixianfeng41/article/details/54668327(main)
https://www.cnblogs.com/songdanzju/p/7422380.html
https://www.cnblogs.com/puheng/p/9575379.html
https://bbs.csdn.net/topics/70227932
C++ 重点关键字的更多相关文章
- 第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery )
一. 前言 在前面的两个章节中,我们分别详细介绍了EF的增删改的两种方式(方法和状态)和EF查询的两种方式( Lambda和Linq ),进行到这里,可以说对于EF,已经入门了,本来应该继续往下进行E ...
- 作为一个新手的Oracle(DBA)学习笔记【转】
一.Oracle的使用 1).启动 *DQL:数据查询语言 *DML:数据操作语言 *DDL:数据定义语言 DCL:数据控制语言 TPL:事务处理语言 CCL:指针控制语言 1.登录 Win+R—cm ...
- ASP.NET MVC深入浅出(被替换) 第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式 第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery ) 第四节: EF调用存储过程的通用写法和DBFirst模式子类调用的特有写法 第六节: EF高级属性(二) 之延迟加载、立即加载、显示加载(含导航属性) 第十节: EF的三种追踪
ASP.NET MVC深入浅出(被替换) 一. 谈情怀-ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态 ...
- JAVA必知必问问题-1
数据类型 1) 基本类型: byte, int, long, float, double, boolean.... 要求记住基本类型占多少字节.范围.例如:byte 1字节范围-128-127,sho ...
- Ubuntu生成应用图标
1.DeskTop Entry介绍 现代 Linux 桌面系统也提供了此项功能.目前,Linux KDE 和 Linux GNOME 桌面系统都使用 Desktop Entry 文件标准来描述程序启动 ...
- 关于ASP.NET Core WebSocket实现集群的思考
前言 提到WebSocket相信大家都听说过,它的初衷是为了解决客户端浏览器与服务端进行双向通信,是在单个TCP连接上进行全双工通讯的协议.在没有WebSocket之前只能通过浏览器到服务端的请求应答 ...
- MySQL之单表查询 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录数:LIMIT 九 使用正则表达式查询
MySQL之单表查询 阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER B ...
- 函数的嵌套+nonlocal和global关键字(重点)
1.在函数中声明函数 在内部函数中使用变量的时候, 查找顺序: 先找自己 -> 上一层 -> 上一层..全局 -> 内置 # 函数的互相调用 # def func1(): # pri ...
- python-day43--单表查询之关键字执行优先级(重点)
一.关键字的执行优先级(重点) 1.关键字执行优先级 from where #约束条件(在数据产生之前执行) group by #分组 没有分组则默认一组 按照select后的字段取得一张新的虚拟表, ...
随机推荐
- 惊奇!用Java也能实现比特币系统
最近区块链技术突然爆火,身边做技术的朋友茶余饭后不谈点区块链什么的都被认为是跟不上时代了,为啥会这样了? 这其实跟比特币价格去年的突飞猛进是分不开的,比特币价格从去年初不到一千美金到今年初最高接近两万 ...
- [Swift]LeetCode908. 最小差值 I | Smallest Range I
Given an array A of integers, for each integer A[i] we may choose any x with -K <= x <= K, and ...
- shell 删除重复文件脚本
摘自 <Linux Shell脚本攻略>一书,例子在109页,原理在110页,原理讲解的很好哦! 需要了解awk命令.xargs,脚本中所用的命令在Linux Shell脚本攻略一书中都有 ...
- Go使用Makefile构建
我们平常很多时候都是直接在命令行输入go build进行编译的: go build . 或者测试使用go run运行项目 go run main.go 我看有很多大型开源项目都是如下方式: mak ...
- Spring中你可能不知道的事(二)
在上一节中,我介绍了Spring中极为重要的BeanPostProcessor BeanFactoryPostProcessor Import ImportSelector,还介绍了一些其他的零碎知识 ...
- Java核心技术及面试指南:视频列表
如下是本书相关内容的视频列表,会动态更新 第一章 1 视频1.1 JDK和JRE和JVM的区别,安装Java开发环境 1.1.1 第2页 2 视频1.2 编写第一个HelloWorld程序 ...
- 死磕 java集合之TreeMap源码分析(三)- 内含红黑树分析全过程
欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. 删除元素 删除元素本身比较简单,就是采用二叉树的删除规则. (1)如果删除的位置有两个叶子节点 ...
- 不懂这些高并发分布式架构、分布式系统的数据一致性解决方案,你如何能找到高新互联网工作呢?强势解析eBay BASE模式、去哪儿及蘑菇街分布式架构
互联网行业是大势所趋,从招聘工资水平即可看出,那么如何提升自我技能,满足互联网行业技能要求?需要以目标为导向,进行技能提升,本文主要针对高并发分布式系统设计.架构(数据一致性)做了分析,祝各位早日走上 ...
- Spring Boot分布式系统实践【1】-架构设计
前言 [第一次尝试去写一个系列,肯定会有想不到的地方,欢迎大家留言指正] 本系列将介绍如果从零构建一套分布式系统.同时也是对自己过去工作的一个梳理过程. 本文先整理出构建系统的主要技术选型,以及技术框 ...
- 手把手教您将 libreoffice 移植到函数计算平台
LibreOffice 是由文档基金会开发的自由及开放源代码的办公室套件.LibreOffice 套件包含文字处理器.电子表格.演示文稿程序.矢量图形编辑器和图表工具.数据库管理程序及创建和编辑数学公 ...