《Thinking in C++》学习笔记(二)【第三章】
第三章 C++中的C
3.4.4 指针简介
‘&’运算符:只要在标识符前加上‘&’,就会得出标识符的地址。
C和C++有一个专门存放地址的变量类型。这个变量类型叫做指针(pointer)。
int* ipa,ipb,ipc; //只有ipa是指针,ipb和ipc是一般的int
要通过指针访问变量,可以使用以前定义指针使用的同样的运算符来间接引用这个指针 *ipa=100;
3.4.6C++引用简介
C++增加了另外一种给函数传递地址的途径,这就是”按引用传递“(pass-by-reference)
带引用的函数调用仅仅比带指针的函数调用在语法上更清晰,它和指针完成同样的任务:允许函数去改变外部对象。
3.4.7用指针和引用作为修饰符
如果声明指针是void*,它意味着任何类型的地址都可以引用那个指针
一旦我们间接引用一个void*,就会丢失关于类型的信息,在使用前必须转换为正确的类型;
//VoidPointer.cpp
int main()
{
void* vp;
char v; int i; float f; double d;
//The address of ANY type can be assiged to a void pionter;
vp=&c; vp=&i;
vp=&f; vp=&d;
} //CastFromVoidPointer
int main()
{
int i=99;
void* vp=&i;
//Can't dereference a void pointer
//*vp=3; //Compile-time error
//Must cast back to int before dereferencing;
*((int*)vp)=3;
}
3.5作用域
作用域告诉我们一个变量的有效范围,在哪里创建,在哪里销毁。变量的有效作用域从它的定义点开始,到和定义变量之前最邻近的开括号配对的第一个闭括号。也就是说,作用域由变量所在的最近一对括号确定。
作用域可以嵌套,即可以在所处的作用域内访问外层作用域的一个变量。
3.5.1实时定义变量
C语言强制在作用域的开始就定义所有变量,以便在编译器创建一个块时,能给所有这些变量分配空间。
C++允许在作用域的任何地方定义变量,还可以在for循环和while循环的控制表达式内定义变量,在if的条件表达式和swith的选择器语句内定义变量。
3.6指定存储空间分配
创建一个变量时我们拥有指定变量生存期限的很多选择,指定怎样给变量分配存储空间。
3.6.1全局变量
全局变量是在所有函数体外部定义的,程序的所有部分甚至其它文件中的代码也可以使用它。
3.6.2局部变量
局部变量经常称为自动变量(automatic variable),因为它们在进入作用域时自动生成,离开作用域后自动消失。
3.6.2.1寄存器变量
寄存器变量是一种局部变量,不能有全局的或静态的register变量,register变量是有限制的,不能得到register变量的地址。
3.6.3静态变量
通常函数中定义的局部变量在函数作用域结束时消失,当再次调用这个函数时会重新创建该变量的存储空间,其值会被重新初始化。如果想再整个程序的生命期里保持这个局部变量的值,可以定义函数的局部变量为static(静态的),初始化只在第一次调用时执行。
static还具有文件作用域(file scope),即变量是局部与文件的,在文件的外部不可以使用这个名字。
//Using a static variable in a function
#include<iostream>
using namespce std; void func(){
static int i=;
cout<<"i="<<i++<<endl;
} int mian(){
for(int x=;x<;x++)
func();
}
3.6.4.1连接
内部连接(internal linkage)意味着只对正在编译的文件创建一片单独的存储空间。用内部连接,别的文件可以使用相同的标示符或全局变量,连接器不会发生冲突——也就是为每一个标示符创建单独的存储空间,在C/C++中,内部连接由关键词static指定。
外部连接意味着为所有编译过的文件创建一片单独的存储空间。一旦存储空间创建,编译器必须解决所有对这片存储空间的引用。全局变量和函数名有外部连接。通过关键字extern声明,可以从其它文件访问这些变量和函数。函数之外定义的所有变量(在C++中除了const)和函数定义默认为外部连接,可以使用关键字static特地强制它们具有内部连接。
调用函数时,自动(局部)只是临时存在于堆栈中,连接器不知道自动变量,所以这些变量没有连接。
3.6.5常量
C++引入了命名常量的概念,命名常量就像变量一样,只是它的值不能改变。可以在参数列表中使用命名常量,即使列表中的参数是指针或引用(可以获得const的地址),const就像正常变量一样有作用域。
3.6.5.1常量值
C++中,一个const必须有初始值。
3.6.6 volatile变量
限定词volatile告诉编译器“不知道何时会改变”,防止编译器依据变量的稳定性做任何优化。
3.7.2.1预处理宏介绍
#define的缺点: (1)不支持类型检查 (2)不考虑作用域 (3)符号名不能限制在一个命名空间中,用宏名中的参数带入语句中的参数
#define Print(Var, digits) count << setw(digits) << (Var) << endl //宏后面没有;号
//Print(Var)中的Print和(之间不能有空格,否则(就会被解释为置换字符串的一部分调用
Print(ival, 15);
预处理器就会把它换成
cout << setw(15) << (ival) << endl;
3.7.6移位运算符
左移运算符(<<)引起运算符左边的操作数向左移动,移动的位数由运算符后面的操作数指定。右移运算符类似。
//Display a byte in binary
#include<iostream>
void printBinary(const unsigned char val){
for(int i=;i>=;i--)
if(val & (<<i))
std::cout<<"";
else
std::cout<<"";
}
3.7.12 C++的显式转换
3.7.12.1静态转换(static_cast)
典型的非强制转换、窄化变换(narrowing conversion)、使用viod*的强制装、隐式类型转换
3.7.12.2常量转换(const_cast)
如果从const转换为非const或从voletile转换为volatile,可以使用cont_cast。
3.7.12.3重解释转换(reinterpret_cast)
3.7.14 asm关键字
这是一种转义(escape)机制,允许在C++程序中写汇编代码。
3.8.3用enum提高程序清晰度
enum关键字通过为所给出的任何标示符赋值0、1、2等值来自动地列举出它们。
枚举类型检查
3.8.4用union节省空间
有时程序会用同一个变量处理不同的数据类型。union把所有的数据放进一个单独的空间内,它计算出放在union中的最大项所需的空间,并生成union的大小。
3.9调试技巧
3.9.1.1预处理器调试标记
3.9.1.2运行期调试标记
3.9.2把变量和表达式转换成字符串
3.9.3 C语言assert()宏
3.10函数地址
3.10.1定义函数指针
void (*funcPtr) (); //从变量名开始,“右-左-右...”动作方式
3.10.3使用函数指针
函数func()的地址是由没有参数列表的函数名(func)产生的,也可以用更加明显的语法&func()。为了调用这个函数,应当用与 声明函数相同的方法间接引用指针。
//Defining and using a pointer to a function
#include<iostream>
using namespace std; void func(){
cout<<"func() called ..."<<endl;
} int main(){
void (*fp) (); //Define a function pointer
fp=func; //Initialize it
(*fp) ();
void (*fp2) ()=func;
(*fp2) ();
}
《Thinking in C++》学习笔记(二)【第三章】的更多相关文章
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第三章:变换
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第三章:变换 学习目标 理解如何用矩阵表示线性变换和仿射变换: 学习在 ...
- JavaScript DOM编程艺术-学习笔记(第三章、第四章)
第三章: 1.js的对象分为三种:①用户自定义对象 ② 内建对象(js提供的对象) ③宿主对象(js寄宿的环境-浏览器,提供的对象) 2.文档是由节点组成的集合,即dom树,html元素是根元素,是唯 ...
- 《深入理解java虚拟机》读书笔记二——第三章
第三章 垃圾收集器与内存分配策略 1.判断对象是否已死 引用计数法: 给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1,每当引用失效时,计数器值就减1. 任何时刻计数器为0的对象就是不 ...
- Linux学习笔记 一 第三章 Linux常用命令
第三章Linux常用命令 一.文件处理命令 1.命令格式 2.目录处理命令:ls 3.目录处理命令:mkdir 4.文件处理命令: touch
- Silverlight 2学习笔记二:三个基本布局控件(Canvas、StackPanel、Grid )
这篇文章主要是翻译了ScottGu博客的文章:Silverlight Tutorial Part 2: Using Layout Management.虽然是翻译,但通过笔记记录,我发现对这三个布局控 ...
- linux学习笔记二:三种网络配置
本文引用自:https://www.linuxidc.com/Linux/2017-05/144370.htm [linux公社] VMware为我们提供了三种网络工作模式,它们分别是:Bridged ...
- JS高级程序设计学习笔记之第三章基本概念(语法,数据类型,流控制语句,函数)——查漏补缺
一.语法: 区分大小写; 2.标识符:就是指变量.函数.属性的名字,或者函数的参数 a.标志符的规则:①第一个字符必须是一个字母.下划线(_)或一个美元符号($). ...
- python 3.5学习笔记(第三章)
本章内容 1.集合及其运算 2.文件操作 3.字符编码与转码 4.函数与函数式编程 5.局部变量与全局变量 6.递归 7.补充知识点 一.集合及其运算 1.概念: set集合是一个不重复元素集,用 { ...
- 【学习笔记】第三章 python3核心技术与实践--Jupyter Notebook
可能你已经知道,Python 在 14 年后的“崛起”,得益于机器学习和数学统计应用的兴起.那为什么 Python 如此适合数学统计和机器学习呢?作为“老司机”的我可以肯定地告诉你,Jupyter N ...
- apue学习笔记(第三章 文件I/O)
本章开始讨论UNIX系统,先说明可用的文件I/O函数---打开文件.读写文件等 UNIX系统中的大多数文件I/O只需用到5个函数:open.read.write.lseek以及close open函数 ...
随机推荐
- OpenStack: OVS安装
> OVS安装:1. Install the Open vSwitch plug-in and its dependencies:# apt-get install \neutron-plugi ...
- iOS学习之Object-C语言简单的通讯录管理系统
用这几天学的OC的知识,写了一个实现简单功能的通讯录管理系统,在这里分享给大家: 通讯录管理系统 * 需求: 1.定义联系人类Contact.实例变量:姓名(拼音,首字母大写).性别.电话号码.住址 ...
- Linux I/O总结
文件流 标准I/O文件流可用于单字节或多字节字符集.流的定向决定了所读写的是单字节还是多字节.流在最初创建时,并没有定向,此时如果在为定向的流上使用多字节I/O函数,那么该流被设置为宽定向的:如果在为 ...
- 服务器 IIS 发布网站 支持下载 apk 和 ipa
方法/步骤 1 打开IIS服务管理器,找到服务器,右键-属性,打开IIS服务属性: 2 单击MIME类型下的"MIME类型"按钮,打开MIME类型设置窗口: 3 单击" ...
- [Linq Expression]练习自己写绑定
源代码:TypeMapper.zip 背景 项目中,我们会经常用到各种赋值语句,比如把模型的属性赋值给UI,把视图模型的属性拷贝给Entity.如果模型属性太多,赋值也会变成苦力活.所以,框架编程的思 ...
- 转Oracle字符集问题总结
Oracle字符集问题总结 分类: Oracle2006-06-04 13:48 1298人阅读 评论(3) 收藏 举报 oracle数据库sqlcharacter存储insert 作者: vston ...
- 老周的ABP框架系列教程 -》 一、框架理论初步学习
老周的ABP框架系列教程 -- 一.框架理论初步学习 1. ABP框架的来源与作用简介 1.1 简介 1.1.1 ABP框架全称为"ASP.NET Boilerplate ...
- 学习Linux第七天
1.shell echo $HOME 默认在shell中编写的变量全部是局部变量,如果重新打开console的话,那么这些变量将全部丢失,全局的变量可以写在文件~/.bashrc文件. 2.判断 !/ ...
- OS X 使用技巧——不用鼠标就能打开应用程序
如果要打开的应用程序没有保留在Dock栏里,一种快速启动它的办法是按住Control+Space键后再输入应用程序的名称.按Control+Space键会开启聚光灯(Spotlight)搜索工具,它会 ...
- Codeforces Round #130 (Div. 2) C - Police Station 最短路+dp
题目链接: http://codeforces.com/problemset/problem/208/C C. Police Station time limit per test:2 seconds ...