当前位置: 首页 > 编程日记 > 正文

C++编程思想重点笔记(上)

  1. C和C++指针的最重要的区别在于:C++是一种类型要求更强的语言。void *而言,这一点表现得更加突出。C虽然不允许随便地把一个类型的指针指派给另一个类型,但允许通过void *来实现。例如:

     bird* b;rock* r;void* v;v = r;b = v;

    C++不允许这样做,其编译器将会给出一个出错信息。如果真的想这样做,必须显式地使用映射,通知编译器和读者。

  2. 参数传递准则
    当给函数传递参数时,人们习惯上应该是通过常量引用来传递,这种简单习惯可以大大提高效率:传值方式需要调用构造函数和析构函数,然而如果不想改变参数,则可通过常量引用传递,它仅需要将地址压栈。 事实上,只有一种情况不适合用传递地址方式,这就是当传值是唯一安全的途径,否则将会破坏对象(而不是修改外部对象,这不是调用者通常期望的)。

  3. C++访问权限控制:public、private、protected
    其中protected只有在继承中才有不同含义,否则与private相同,也就是说两者只有一点不同:继承的结构可以访问protected成员,但不能访问private成员。

  4. 前置声明注意

     struct X;  // Declaration(incomplete type spec)struct Y{void f(X *memx);  void g(X memx);  // not allowed, the size of X is unknown.};

    这里f(X*)引用了一个X对象的地址,这是没有任何问题的,但如果是void g(X memx);就不行了,编译器会报错。这一点很关键,因为编译器知道如何传递一个地址,这一地址大小是一定的,而不用管被传递的对象类型大小。如果试图传递整个对象,编译器就必须知道X的全部定义以确定它的大小以及如何传递它,这就使程序员无法声明一个类似于Y :: g(X) 的函数。

  5. C++是纯的吗?
    如果某个类的一个函数被声明为friend,就意味着它不是这个类的成员函数,但却可以修改类的私有成员, 而且它必须被列在类的定义中,因此我们可以认为它是一个特权函数。这种类的定义提供了有关权限的信息,我们可以知道哪些函数可以改变类的私有部分。 因此,C++不是完全的面向对象语言,它只是一个混合产品。friend关键字就是用来解决部分的突发问题。它也说明了这种语言是不纯的。毕竟C + +语言的设计是为了实用,而不是追求理想的抽象。

  6. C++输入输出流的操纵算子(manipulator)有:endl、flush、ws、hex等。

     cout<<flush;   // 清空流   cout << hex << "0x" << i;  // 输出16进制   cin>>ws;  // 跳过空格

    iostream.h还包括以下的操纵算子:

    如何建立我们自己的操纵算子?
    我们可能想建立自己的操纵算子,这是相当简单的。一个像endl这样的不带参数的操纵算子只是一个函数,这个函数把一个ostream引用作为它的参数。对endl的声明是:

    ostream& endl(ostream&);

    例子:产生一个换行而不刷新这个流。人们认为nl比使用endl要好,因为后者总是清空输出流,这可能引起执行故障。

     ostream& nl(ostream& os) {return os << "\n";}int main() {cout << "newlines" << nl << "between" << nl << "each" << nl << "word" << nl;return 0;}
  7. C语言中const与C++中const的区别:
    常量引进是在早期的C++版本中,当时标准C规范正在制订。那时,常量被看作是一个好的思想而被包含在C中。但是,C中的const意思是“一个不能被改变的普通变量”,在C中,它总是占用存储而且它的名字是全局符。C编译器不能把const看成一个编译期间的常量。在C中, 如果写:

    const bufsize=100char buf[bufsize];

    尽管看起来好像做了一件合理的事,但这将得到一个错误结果。因为bufsize占用存储的某个地方,所以C编译器不知道它在编译时的值。在C语言中可以选择这样书写:

    const bufsize;

    这样写在C++中是不对的,而C编译器则把它作为一个声明,这个声明指明在别的地方有存储分配。因为C默认const是外部连接的,C++默认cosnt是内部连接的,这样,如果在C++中想完成与C中同样的事情,必须用extern把连接改成外部连接:

    extern const bufsize;//declaration only

    这种方法也可用在C语言中。
    注意:在C语言中使用限定符const不是很有用,即使是在常数表达式里(必须在编译期间被求出);想使用一个已命名的值,使用const也不是很有用的。C迫使程序员在预处理器里使用#define。

  8. 类里的const和enum
    下面的写法有什么问题吗?:

     class bob {const size = 100;  // illegalint array[size];   // illegal}

    结果当然是编译不通过。why?因为const在类对象里进行了存储空间分配,编译器不能知道const的内容是什么,所以不能把它用作编译期间的常量。这意味着对于类里的常数表达式来说,const就像它在C中一样没有作用。

    在类里的const意思是“在这个特定对象的寿命期内,而不是对于整个类来说,这个值是不变的”。那么怎样建立一个可以用在常数表达式里的类常量呢?
    一个普通的办法是使用一个不带实例的无标记的enum。枚举的所有值必须在编译时建立,它对类来说是局部的,但常数表达式能得到它的值,这样,我们一般会看到:

     class bob {enum { size = 100 };  // legalint array[size];      // legal}

    使用enum是不会占用对象中的存储空间的,枚举常量在编译时被全部求值。我们也可以明确地建立枚举常量的值:enum { one=1,two=2,three};

  9. 类里面的const成员函数

     class X {int i;public:int f() const;      }

    这里f()是const成员函数,表示只能const类对象调用这个函数(const对象不能调用非const成员函数),如果我们改变对象中的任何一个成员或调用一个非const成员函数,编译器将发出一个出错信息。
    关键字const必须用同样的方式重复出现在定义里,否则编译器把它看成一个不同的函数:

    int X::f() const { return i;}

    任何不修改成员数据的函数应该声明为const函数,这样它可以由const对象使用。
    注意:构造函数和析构函数都不是const成员函数,因为它们在初始化和清理时,总是对对象作些修改。


    引申:如何在const成员函数里修改成员 —— 按位和与按成员const

    如果我们想要建立一个const成员函数,但仍然想在对象里改变某些数据,这时该怎么办呢?这关系到按位const和按成员const的区别。按位const意思是对象中的每个位是固定的,所以对象的每个位映像从不改变。按成员const意思是,虽然整个对象从概念上讲是不变的,但是某个成员可能有变化。当编译器被告知一个对象是const对象时,它将保护这个对象。

    这里我们要介绍在const成员函数里改变数据成员的两种方法。

  • 第一种方法已成为过去,称为“强制转换const”。它以相当奇怪的方式执行。取this(这个关键字产生当前对象的地址)并把它强制转换成指向当前类型对象的指针。看来this已经是我们所需的指针,但它是一个const指针,所以,还应把它强制转换成一个普通指针,这样就可以在运算中去掉常量性。下面是一个例子:

    class Y {int i, j;
    public:Y() { i = j = 0; }void f() const;
    };void Y::f() const {
    //!  i++;  // error((Y*)this)->j++;  // ok , cast away const feature.
    }

    这种方法可行,在过去的程序代码里可以看到这种用法,但这不是首选的技术。问题是:this没有用const修饰,这在一个对象的成员函数里被隐藏,这样,如果用户不能见到源代码(并找到用这种方法的地方),就不知道发生了什么。

  • 第二种方法也是推荐的方法,就是在类声明里使用关键字mutable,以指定一个特定的数据成员可以在一个const对象里被改变。

    class Y {int i;mutable int j;
    public:Y() { i = j = 0; }void f() const;
    };void Y::f() const {
    //!  i++;  // error((Y*)this)->j++;  // ok , mutable.
    }

volatile关键字

volatile的语法与const是一样的,但是volatile的意思是“在编译器认识的范围外,这个数据可以被改变”。不知何故,环境正在改变数据(可能通过多任务处理),所以,volatile告诉编译器不要擅自做出有关数据的任何假定—在优化期间这是特别重要的。如果编译器说:“我已经把数据读进寄存器,而且再没有与寄存器接触”。一般情况下,它不需要再读这个数据。但是,如果数据是volatile修饰的,编译器不能作出这样的假定,因为可能被其他进程改变了, 它必须重读这个数据而不是优化这个代码。

注意:

  • 就像建立const对象一样,程序员也可以建立volatile对象,甚至还可以建立const volatile对 象,这个对象不能被程序员改变,但可通过外面的工具改变。
  • 就像const一样,我们可以对数据成员、成员函数和对象本身使用volatile,可以并且也只能为volatile对象调用volatile成员函数。
  • volatile的语法与const是一样的,所以经常把它们俩放在一起讨论。为表示可以选择两个中的任何一个,它们俩通称为c-v限定词

相关文章:

一行命令实现录屏,支持热键和鼠标操作,区域、帧率、格式任你选择

作者&#xff1a;天元浪子来源&#xff1a;CSDN 博客市面上的录屏工具软件有很多&#xff0c;基本都是窗口程序。毕竟&#xff0c;离开GUI的支持&#xff0c;设置参数、选择录像区域等操作都会变得非常困难。不过&#xff0c;窗口程序也并非无往不胜&#xff0c;即便是屏幕录像…

SMO学习笔记(二)——还原(恢复)篇之完整恢复

SQLSERVER2005恢复介绍&#xff1a; 三种恢复模式(一).简单恢复模式 事务日志被自动截断&#xff0c;不能使用日志文件进行恢复。(二).完整恢复模式 保留所有操作的完整事务日志。(三).大容量日志恢复模式 简要记录大容量操作&#xff08;索引创建和大容…

linux内核map图

linux内核map图

Linux下tcpdump用法

根据使用者的定义对网络上的数据包进行截获的包分析工具。tcpdump将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤&#xff0c;并提供了and、 or、not等逻 辑语句来帮助过滤不必要的信息&#xff1b;   默认情况下&#…

终于有人站出来为程序员说话了

【CSDN 编者按】刘少山博士是《程序员》杂志的作者之一&#xff0c;多年来投稿了大量无人驾驶领域相关的优质内容&#xff0c;《新程序员》上线后&#xff0c;他带着自己多年来对技术行业的思考以及对程序员群体的殷切期望重新回归&#xff0c;希望能对大家有所启迪。作者 | 刘…

给 Windows 驱动程序安装提速

对比各种主流操作系统&#xff0c;在 Windows 上安装驱动程序是最直观最方便的&#xff0c;不仅可以通过设备管理器查看所有硬件的信息并安装驱动&#xff0c;在有新硬件插入时也有人性化的驱动程序安装提示和安装向导&#xff0c;甚至还可以在线安装驱动&#xff0c;这都是其他…

web标准化设计:常用的CSS命名规则

常用的CSS命名规则 头&#xff1a;header 内容&#xff1a;content/container 尾&#xff1a;footer 导航&#xff1a;nav 侧栏&#xff1a;sidebar 栏目&#xff1a;column 页面外围控制整体布局宽度&#xff1a;wrapper 左右中&#xff1a;left right center 登录条&#xff…

鲲鹏应用创新大赛山西区域赛圆满落幕,鲲鹏生态助力信创变革

鲲鹏入晋&#xff0c;万里腾飞&#xff0c;8 月 6 日&#xff0c;2021 鲲鹏应用创新大赛山西赛区决赛在太原圆满落幕。今年鲲鹏应用创新大赛区域赛山西赛区是山西省内数字化转型的重要赛事&#xff0c;经过层层选拔&#xff0c;共 35 个队伍进入山西赛区决赛&#xff0c;参加政…

视频分享网站首页:最新视频特效

2019独角兽企业重金招聘Python工程师标准>>> <!DOCTYPE> <html> <head><title></title><style>.newVideo{width:208px;height:116px;border:0px solid #000; position:relative;cursor:pointer;}.newVideoImg{position:relativ…

Metasploit攻击Oracle的环境搭建

Metasploit中关于Oracle的攻击模块默认并不完全&#xff0c;需要自己做一些工作。本文主要记录在搭建环境的中的一些错误&#xff08;操作系统Backtrack 5&#xff09;。在默认情况下使用oracle的一些攻击功能会出现类似如下错误&#xff1a;ary module execution completed m…

jQuery / jQuery mvc plugin

jMVC专为 Qt WRT 设计。Qt WRT 将随新版Qt发布&#xff0c;支持 Symbian ^3 和 Meego 设备。jMVC 采用延迟加载设计&#xff0c;代码分布在不同的.js文件中&#xff0c;调用时通过xhr加载。 在web环境中会严重影响性能&#xff0c;所以jMVC不适合开发web site。目前大部分web b…

【转发】什么时候该用委托,为什么要用委托,委托有什么好处

好多人一直在问:什么时候该用委托,为什么要用委托,委托有什么好处.... 看完下面的文章你将茅塞顿开..(看不懂的直接TDDTDS) 概念虽然我不喜欢讲太多 我们直接先来YY 个场景:我很喜欢打游戏,但运气不好每次打游戏都会被主管看到,朱老板不喜欢他的员工在上班的时 间打游戏,所以朱…

一位合格软件工程师应该具备怎样的工程化、交付能力?

大厂待遇高、福利也好相信很多同学都对大厂有着向往&#xff0c;然而现实却是......有的同学成功拿到offer进入大厂&#xff0c;有的同学还在为备考大厂迷茫苦恼着&#xff1a;我之前从未面试过&#xff0c;这次冒险投了字节&#xff0c;几乎是抱着积累经验和技术交流的心态去了…

Flex通信-Java服务端通信实例

Flex与Java通信的方式有很多种&#xff0c;比较常用的有以下方式&#xff1a; WebService&#xff1a;一种跨语言的在线服务&#xff0c;只要用特定语言写好并部署到服务器&#xff0c;其它语言就可以调用 HttpService&#xff1a;通过http请求的形式访问服务器 RmoteObject&am…

jQuery性能优化指南

1&#xff0c;总是从ID选择器开始继承 在jQuery中最快的选择器是ID选择器&#xff0c;因为它直接来自于JavaScript的getElementById()方法。 例如有一段HTML代码&#xff1a; <div id"content"> <form method"post" action"#"> &l…

速度快到飞起 如何跟蜻蜓的大脑学习计算?

编译 | 禾木木 出品 | AI科技大本营(ID:rgznai100) 科学家研究了其中一种大型昆虫蜻蜓的大脑&#xff0c;希望利用这些昆虫的专长来设计计算系统&#xff0c;这些系统针对拦截来袭导弹或跟踪气味羽流等任务进行了优化。通过利用蜻蜓神经系统的速度、简单性和效率&#xff0c;目…

Python、Unicode和中文

python的中文问题一直是困扰新手的头疼问题&#xff0c;这篇文章将给你详细地讲解一下这方面的知识。当然&#xff0c;几乎可以确定的是&#xff0c;在将来的版本中&#xff0c;python会彻底解决此问题&#xff0c;不用我们这么麻烦了。先来看看python的版本&#xff1a;>&g…

提高mysql性能的开源软件

今天发现一个开源软件,看介绍可以提高mysql的性能,这个东西就是Google的开源TCMalloc库,于是拿来装了下看看效果.这个软件下载地址是:http://code.google.com/p/google-perftools/downloads/list,我用的是最新版的google-perftools-1.4.tar.gz.1.安装过程:#tar zxvf google-per…

一款比较实用齐全的jQuery 表单验证插件

一款比较实用,并且验证类型齐全的jQuery表单验证插件.英文版原作者Vanadium,由我做中文整理.E文水平有限,如果翻译的有问题的,请大家指出,在此感谢~可以验证哪些? 文字,日期,邮箱,网址,数字,AJAX用户名验证以及自定义的正则等等几乎所有我们要用到的验证.不多说,看DEMO吧: 点此…

[原]VS2012编译GLEW 1.11

1、到http://glew.sourceforge.net/下载源代码 2、使用vs2012打开build下vc6的glew.dsw &#xff0c;自动生成2012工程&#xff08;一路点确定&#xff09;特别注意&#xff1a;不要使用build下的vc12之类的 本人亲测不好使 坑了我很久 3、直接生成解决方案&#xff0c;会在根目…

长相酷似小强的小米「铁蛋」机器狗,售价 9999 元,打滚唱跳会空翻

整理 | 禾木木 出品 | AI科技大本营(ID:rgznai100) 8月10日晚&#xff0c;雷军年度演讲及小米秋季发布会在线上召开&#xff0c;此次发布会足足讲了三个小时&#xff0c;不仅介绍了小米的目前市场状况&#xff0c;还分享了新品以及小米机器人实验室的第一款产品——机器狗「铁…

java中图片文件的判断

javax.imageio 类 ImageIO BufferedImage bi ImageIO.read(resFile);//resFile --- InputStreamif(bi null){ System.out.println(此文件不为图片文件); }try {//判断是否为图片文件并且返回图片的格式&#xff01;ImageInputStream iis ImageIO.createImageInputStream(o)…

jQuery中常用的函数方法总结

jQuery中为我们提供了很多有用的方法和属性&#xff0c;自己总结的一些常用的函数&#xff0c;方法。个人认为在www.21kaiyun.com的紫微斗数星座在线排盘开发中会比较常用的&#xff0c;仅供大家学习和参考。 事件处理 ready(fn) 代码&#xff1a;$(document).ready(functi…

使用editcap命令将ERF格式转换为pcap格式

editcap是Wireshark的一个组件&#xff0c;在Windows平台下&#xff0c;只要完成Wireshark的安装&#xff0c;就可以在安装目录中看到editcap.exe。editcap.exe需要在命令行中使用。 对于用Endace DAG捕捉卡捕获的数据包&#xff0c;一般来说&#xff0c;都是erf格式的。ERF格式…

中关村开源创新大赛-达闼赛道如火如荼进行中

导语为庆祝中国共产党成立100周年&#xff0c;中关村软件园携手云端机器人运营商达闼&#xff0c;联合举办了中关村开源创新大赛-达闼赛道&#xff0c;暨“不忘初心 AI创时代”达闼智能服务机器人编舞大赛。在小姜的灵动舞姿下&#xff0c;今天&#xff0c;达闼赛道正式启动&am…

国际版Azure搭建Windows多种类型×××_三.配置SSTP ×××连接服务

安全套接字隧道协议&#xff08;SSTP&#xff09;是一种新的***隧道形式&#xff0c;具有允许流量通过阻止PPTP和L2TP / IPsec流量的防火墙的功能。 SSTP提供了一种在HTTPS协议的SSL通道上封装PPP流量的机制。 PPP的使用允许支持强认证方法&#xff0c;如EAP-TLS。 使用HTTPS意…

超强的jquery极品插件--色彩选择器类/ 右键菜单类/ 图片新闻flash展示类

Farbtastic Farbtastic是一个color picker插件。它能够在一个页面中加入多个颜色选择控件&#xff0c;然后每个控件关联到页面中的一个元素比如&#xff1a;文本输入框。FarbtasticjQuery Color Picker 21世纪开运网在线排盘星座就成功运用这些技巧&#xff0c;www.21kaiyun.co…

张口闭口就是焦虑,现在的程序员怎么了?

【CSDN 编者按】在网上&#xff0c;我们经常会看到各类程序员的吐槽&#xff0c;学历焦虑、大厂焦虑充斥着手机屏幕&#xff0c;本文作者从这一角度出发&#xff0c;用质朴的文字告诉年轻一代程序员一个事实&#xff1a;慢慢走好编程每一步&#xff0c;不要害怕更不用着急&…

epoll 的实现原理以及与poll,select 的对比

最近面试的时候 被问到epoll的问题&#xff0c;就下来查一查&#xff0c;看到有篇文章不错&#xff0c;就记录下来&#xff0c;供大家参考学习。 以一个生活中的例子来解释. 假设你在大学中读书,要等待一个朋友来访,而这个朋友只知道你在A号楼,但是不知道你具体住在哪里,于是你…

js 字符串转换成数字的 三种方法

在js读取文本框或者其它表单数据的时候获得的值是字符串类型的,例如两个文本框a和b,如果获得a的value值为11,b的value值为9 ,那么a.value要小于b.value,因为他们都是字符串形式的.在网上找了一下js字符串转数字的文章,这个比较全方法主要有三种 转换函数、强制类型转换、利用js…