templates(0.1)

每一位 C++ 程序员都有自己的一套编程风格。这就引来了各种问题:哪儿应该 插入空白符号、怎么摆放分隔符(大括号、小括号)…等等。我们尽量保持全书风格一致, 当然有时候我们也对特殊问题作出让步。例如在教本(初阶)部份我们鼓励以空白符号和较具体的命名方式提高程序可读性,而在高阶主题中,较紧凑的风格可能更加适宜。

我们有一个他人不太常用的习惯,用以声明类型(types)、参数(parameters)和变量(variables), 希望你能多加注意。下面数种方式无疑都是合理的:

void foo (const int &x);
void foo (const int& x);
void foo (int const &x);
void foo (int const& x);

 

尽管较为罕见,我们还是决定在表达「固定不变的整数」(constant integer)时使用 int const而不写成 const int。这么做有两个原因,第一,这很容易显现出「什么是不能变动的(what isconstant)」。不能变动的量总是 const 饰词之前的那个东西。尽管以下两式等价:

const int N = 100; //一般人可能的写法

int const N = 100; //本书习惯写法

但对以下述句来说就不存在所谓的等价形式了:

int* const bookmark; // 指针 bookmark 不能变动,但指针所指内容(int)可以变动

如果你把 const 饰词放在运算符 * 之前,那就改变了原意。本例之中不能变动的是指针本身,不是指针所指的内容。

第二个原因和语法替换原则(syntactical substitution principle)有关,那是处理 template 程序代码时常会遭遇的问题。考虑下面两个类型定义:

typedef char* CHARS;
typedef CHARS const CPTR; // 一个用以「指向 chars」的 const 指针,如果我们做文字上的替换,把 CHARS 替换为其代表物,上述第二个声明的原意就得以保留:
typedef char* const CPTR; // 一个用以「指向 chars」的 const 指针。然而如果我们把 const 写在被修饰物之前,上述规则便不适用。考虑上述声明的另一种变化:

typedef char* CHARS;
typedef const CHARS CPTR; // 一个用以「指向 chars」的 const 指针,现在,对 CHARS 进行文字替换,会导出不同的含义:
typedef const char* CPTR; // 一个用以「指向 const chars」的指针

面对volatile饰词,也有同样考虑。关于空白符号,我们决定把他放在"&"符号和参数名称中间:

void foo (int const& x);

这样可以更加突出参数的类型和名称。无可否认,以下声明方式可能较易引起疑惑:

char *a, b;

根据从 C 语言继承下来的规则,a 是个指针而b 是个一般的 char。为了避免这种混淆,我们可以一次声明一个变量,不要集中于同一行声明语句。

本书并不是一本讨论C++标准库的书,但我们确实在一些例子中用到了标准库。一般 来说,我们使用C++特有的 头文件(例如<iostream> 而非<stdio.h>) 。惟一的例外是<stddef.h>,我们使用它而不使用<cstddef>,以避免类型 size_t 和 ptrdiff_t 被冠以 std::前缀词。这样做更具可移植性,而且 std::size_t 并不比 size_t 多出什么好处。

#include<cstdio>
#include<iostream>
using namespace std;
int main()
{const int N=100;int const N=100; //二者等价int mark=0;//1int* ref_mark=&mark;int* const book1=ref_mark;//指针book1是个常量,并没有说明这个指针指向的int值是个常量const int* book2=ref_mark;//指针book2是个指针类型的常量cout<<"N1:"<<N1<<endl;cout<<"N2:"<<N2<<endl;*book1=10;cout<<*book1<<endl;*book2=20;/*|error: assignment of read-only location ‘* book2’|const int *book2=ref_mark*/cout<<*book1<<endl;cout<<*book2<<endl;//2typedef char* CHARS;typedef CHARS const CPTR;    //替换后typedef char * const CPTR;//仍然是指向char类型的常量指针
    typedef const CHARS CPTR;   //替换后typedef const char * CPTR;//是指向char类型的指针

}

 

转载于:https://www.cnblogs.com/jianfengyun/p/3714569.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/420951.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实验4 进程运行轨迹的跟踪与统计

进程运行轨迹的跟踪与统计 难度系数&#xff1a;★★★☆☆ 实验目的 掌握Linux下的多进程编程技术&#xff1b;通过对进程运行轨迹的跟踪来形象化进程的概念&#xff1b;在进程运行轨迹跟踪的基础上进行相应的数据统计&#xff0c;从而能对进程调度算法进行实际的量化评价&…

虚拟环境创建,pip管理包

windows10虚拟环境的创建&#xff0c;pip管理包1.虚拟环境的创建1.1 为什么要创建虚拟环境1.2 创建虚拟环境1.3 激活虚拟环境1.3.1 激活方式1.3.2 检查是否创建成功2.用pip管理包2.1 pip的基本使用2.2 pip创建安装的文件requirements.txt2.3 安装包对应的版本2.4 用pip - r ins…

Linux C编程一些优秀的博客链接

1&#xff0c;C进程内存分布 https://www.cnblogs.com/fengyv/p/3789252.html 2&#xff0c;fork入门讲解 http://blog.csdn.net/jason314/article/details/5640969

vi文字处理器

http://blog.csdn.net/wangloveall/article/details/22649331 摘要&#xff1a;vi是类UNIX命令行接口的标准文字处理软件&#xff0c;也是进行shell脚本程序编写与服务器设置的非常重要的工具。本文介绍vi文字处理器&#xff0c;包括vi简介、vi怎么使用、vi的加强版vim。 关键词…

顺序栈,链栈

栈与链栈一&#xff0c;顺序栈1.1 IStack栈接口1.2&#xff0c;顺序栈增删改查的实现1.3&#xff0c;测试顺序栈二&#xff0c;链栈2.1&#xff0c;存放数据的结点2.2&#xff0c;链栈的实现2.3测试链栈一&#xff0c;顺序栈 1.1 IStack栈接口 public interface IStack {publ…

Ubuntu14.04LTS打造实用的环境

1&#xff0c;安装Ubuntu14.04LTS以后&#xff0c;首先要更新一下源&#xff0c;下面使用163源&#xff1a; 首先备份源列表: sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup清空原来的/etc/apt/sources.list&#xff0c;添加网易的源列表 deb http://mirrors.…

用numpy,matplotlib库画笛卡尔爱心曲线

1650年&#xff0c;斯德哥尔摩的街头&#xff0c;52岁的笛卡尔邂逅了18岁的瑞典公主克里斯汀。   那时&#xff0c;落魄、一文不名的笛卡尔过着乞讨的生活&#xff0c;全部的财产只有身上穿的破破烂烂的衣服和随身所带的几本数学书籍。生性清高的笛卡尔从来不开口请求路人施舍…

poj 1715 Hexadecimal Numbers 排列组合

1 /**2 大意&#xff1a; 给定16进制数的16个字母&#xff0c;&#xff0c;求第k大的数&#xff0c;&#xff0c;要求数的长度最大为8.&#xff0c;并且每个数互不相同。3 思路&#xff1a; 从高到低挨个枚举&#xff0c;每一位能组成的排列数 &#xff0c;拿最高位来说&#x…

centos7虚拟机共享本机磁盘的方法

说明&#xff1a;这个方法不一定是通用的&#xff0c;也可能不是最快捷的&#xff0c;但是感觉比较稳妥的办法。 1&#xff0c;首先坚持两个进程是否启动&#xff1a;右击&#xff1a;我的电脑-管理-服务&#xff0c;检查server服务和Workstation服务是否启动。如果没有启动&a…

文件读写的“二进制模式”和“文本模式”

二进制模式&#xff1a;将内存中的数据&#xff08;01序列&#xff09;直接传送到文件中&#xff0c;没有任何转换。如&#xff1a;char ch 0x7d; fwrite(&ch, sizeof(char), 1, pfile);直接把0x7d这个01序列存储到文件中。文本模式&#xff1a;将内存中的数据&#xff08…

服务器小程序servlet的使用

servlet的创建使用一&#xff0c;三种创建方式1.1 实现servlet接口1.2 继承GenericServlet1.3 继承HttpServlet二&#xff0c;servlet使用2.1 web.xml文件的配置2.1.1 创建xml文件2.1.2 手写web.xml文件2.2 在8080端口下访问2.2.1 servlet的生命周期servlet是服务器小程序。是个…

hadoop MultipleInputs fails with ClassCastException (get fileName)

来自&#xff1a;http://stackoverflow.com/questions/11130145/hadoop-multipleinputs-fails-with-classcastexception Following up on my comment, the Javadocs for TaggedInputSplit confirms that you are probably wrongly casting the input split to a FileSplit: /**…

自己常用的Linux命令总结

原则&#xff1a;自己使用过的&#xff0c;不易记忆的&#xff0c;功能强大的 grep 名称意义&#xff1a;全称Global Regular Expression Print&#xff0c;表示全局正则表达式是一个强大的文本搜索工具&#xff0c;采用正则匹配命令格式&#xff1a;grep [options] files O…

XSS与CSRF两种跨站攻击比较

XSS&#xff1a;跨站脚本&#xff08;Cross-site scripting&#xff09; CSRF&#xff1a;跨站请求伪造&#xff08;Cross-site request forgery&#xff09; 在那个年代&#xff0c;大家一般用拼接字符串的方式来构造动态SQL 语句创建应用&#xff0c;于是SQL 注入成了很流行的…

褚时健:现在的年轻人太急了,我快90了还在摸爬滚打

转自&#xff1a;http://news.163.com/17/0715/08/CPCF0D6R00018AOR.html &#xff08;本人说明&#xff1a;这篇访谈太“鸡汤”了&#xff0c;我读了好几遍&#xff0c;里面精彩的部分我用红字标出来了&#xff0c;感觉褚时健老前辈的精神和做事的态度方法真的值得学习&#…

Java日期格式化SimpleDateFormat

package test;import java.text.SimpleDateFormat; import java.util.Date;public class TestDate {public static void main(String[] args) {// 大写的HH是24小时 小写的是12小时SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date d null;…

VS或编译的时候不生成Release文件夹

今天在编译第三方类的时候&#xff0c;总是发布的时候报没有第三方类库的的Release版本 解决方案&#xff1a; Build>Configuration Manager>Release 编译》配置管理》选择发布版本 再编译就有了转载于:https://www.cnblogs.com/flyfish2012/p/3728516.html

el表达式,c标签的使用

el表达式的使用 学生类 public class Student {int id;String name;String sex;String birth;public Student() {}public Student(int id, String name, String sex, String birth) {super();this.id id;this.name name;this.sex sex;this.birth birth;}// el 表达式取实…