C++的OOP特性
内存模型和名称空间
- 存储持续性,作用域和链接性
C++有三种方案来存储数据- 自动存储持续性:在函数定义中声明的变量,包括函数参数。在函数或代码块开始执行时创建。执行完函数或者代码块,内存自动释放。
- 静态存储持续性:函数定义外定义的变量和使用关键字static定义的变量。他们在程序的整个运行过程中都存在。
- 动态存储持续性:用new分配的内存,要显式使用delte操作符释放或者程序结束,系统程序来释放。
作用域表述变量名称的可见范围。在某一范围内,变量名称不能重复。链接性描述名称如何在不同单元(通常为文件)之间进行共享。链接性为外部,则可多个文件共享。链接性为内部,则只能在一个文件中的函数共享。自动变量无链接性,则不能共享。
自动存储持续性:在默认情况下,函数中声明的函数参数和变量为自动存储持续性。作用域为局部,没有链接性。
静态持续变量有三种链接性:
- 外部链接性:在代码块外面声明它。又称为全局变量。可以多个文件分享数据。但是const 全局常量的链接性为内部链接性。因为变量有且只能有一个文件包含其定义,在其他文件使用时,使用extern关键字进行引用声明。
- 内部链接性:在代码块外面声明它,但是用static修饰。static将链接性限定为本文件,但是可以在本文件的多个函数间分享数据。其他文件用extern声明它时,编译器找不到该变量。本地的static静态变量会隐藏常规外部变量。
- 没有链接性:在代码块内部声明它,但是用static修饰。在整个程序运行期间,其内存一直存在,程序结束才会释放。而且即使函数被调用多次,其初始化语句只会执行一句。
未被初始化的静态变量的所有位都被设置为0。
C++关键字中有一些被称为存储说明符(storage class specifier)和cv-限定符的关键字。他们提供了有关数据(变量)的存储信息。
CV限定符
- const:它表明,内存被初始化后,程序便不能再对它进行修改。所以const常量声明时就必须初始化。但是const全局变量的链接性为内部的。所以可以在头文件中包含常量声明。因为在源代码文件中#include头文件后,其链接性为该文件内部。
- volatile:它修饰变量,表明即使程序代码没有对内存单元进行修改,其内存内容也可能改变。比如两个程序共享数据,指针指向某个硬件,该硬件的数据会自行改变。如果一个变量被连续几个语句使用,编译器一般会优化代码,将该数据取出后放在寄存器中参与运算。最后再一次性写回内存。对volatile变量不会如此。
存储说明符
- auto:将变量声明为自动变量。因为变量默认就为自动变量,一般不用。
- register:指出变量为寄存器存储类型。
- static:将全局变量声明为内部链接性。将局部变量声明为无链接性,且为静态持续。
- extern:表明是引用声明,声明引用在其它地方/文件中定义的变量。编译器见到此声明,去其他文件寻找变量定义。
- mutable:一般修饰结构或者类中的某个成员变量。指出即使结构或类变量为const,其中的某个成员也可以被修改。
函数也有链接性。函数的存储持续性默认为静态,链接性默认为外部,即可跨文件共享。所以在一个工程中参与编译的文件中。函数不可重名。还可以使用static修饰函数,将其链接性设置为一个文件。则不同文件中可以有同名函数。static要同时修饰原型和定义。
- 布局new操作符
- 存储持续性,作用域和链接性
对象和类
不必在类中使用关键字private。因为这是类对象的默认访问控制。
C++中的结构和类十分相像,类就像是包含成员函数以及public和private可见性标签的结构声明。实际上,它们之前的惟一区别是,结构的默认访问类型是public,而类是private。可以用类来表示纯粹的数据对象或者没有私有部分的类。
和cout一样,cerr也是一个ostream对象,两者区别在于,操作系统重定向只影响cout,而不影响cerr。所以,如果将程序输出重定向到文件,并且发生了错误,则屏幕上依然会出现错误消息。在UNIX系统中,>用于对cout进行重定向, 2>对cerr进行重定向。
类声明习惯于将短小的成员函数作为内联函数。
- 定义位于类声明中的函数都将自动成为内联函数。
- 也可以在类声明之外定义成员函数。在定义函数时用inline限定符即可。类中函数声明可不使用inline。
- 内联函数要求每个使用他们的文件中都有对其进行定义。所以常将内联定义放在定义类的头文件中。
使用构造函数的两种方式:
- 显式调用构造函数:ClassName classVar = ClassName(...)
- 隐式调用构造函数:ClassName classVar(...);
构造函数是用来创建对象的,因此对象不能调用构造函数。如果程序员没有提供任何构造函数,则C++将自动提供任何构造函数,但是它不做任何工作。但是只要程序员提供构造函数,则C++编译器就不会自动提供默认构造函数。所以,程序员必须自己提供默认构造函数,否则
ClassName classVar;
这样代码会编译错误。定义默认构造函数的两种方式:
- 给已有构造函数的所有参数提供默认值。
- 通过函数重载定义一个没有参数的构造函数。
但是默认构造函数只能有一个,否则会产生二异性。所以上述两种方式只能采用一种。而且在隐式调用默认构造函数时,不要使用()。
Stock stock1(); //这是声明了一个名为stock1,无参数,返回值为Stock的函数
构造函数创建对象,等对象过期时,程序自动调用析构函数用来进行清理工作。最简单的是在构造函数中用new动态申请内存空间,在析构函数中用delete释放内存。
在默认情况下,将一个对象赋值给同类型的另一个对象时,C++将源对象的每个数据成员的内容复制到目标对象中相应的数据成员中。基本数据类型,结构变量,类对象原理一样。
C++的OOP特性的更多相关文章
- 高级OOP特性(6)
PHP不支持的高级OPP特性 PHP不支持通过函数重载实现多态 PHP不支持多重继承 PHP不支持根据所修改数据类型为操作符赋予新的含义 对象克隆 克隆实例 在对象前面添加clone关键字来克隆对象, ...
- 使用JavaScript OOP特性搭建Web应用
最近,我面试了一个有五年 Web 应用程序开发经验的软件开发人员.四年半来她一直在从事 JavaScript 相关的工作,她自认为 JavaScript 技能非常好,但在不久之后我就发现实际上她对 J ...
- LUA OOP编程实现方法
lua原生不支持OOP特性 确实如此, 同时可以采用其它lua代码的方式实现OOP的特性. OOP四大特性 抽象 封装 继承 多态 http://www.cnblogs.com/xiaosongluf ...
- 转:Delphi的类与继承(VB与delphi比较)
既然已经做出了com程序用delphi来开发的决定,那当然就要对delphi进行一些深入的了解.有人说delphi是一个用控件堆砌起来的工具,和vb没什么两样:也有人说dephi实际上是面向过程的,他 ...
- Php:学习笔记(一):版本选择
(注:本文来自网络) 超过75%的网站使用了PHP作为开发语言,wordpress,phpmyadmin和其他一些开源项目的盛行,带来了一大批的长尾用户.然而,他们一般安装之后却很少升级.下图是目前P ...
- 基于类型系统的面向对象编程语言Go
(整理自网络) 面向对象编程 Go语言的面向对象编程(OOP)非常简洁而优雅.说它简洁,在于它没有了OOP中很多概念,比如:继承.虚函数.构造函数和析构函数.隐藏的this指针等等.说它优雅,是它的面 ...
- C++ STL轻松导学
作为C++标准不可缺少的一部分,STL应该是渗透在C++程序的角角落落里的.STL不是实验室里的宠儿,也不是程序员桌上的摆设,她的激动人心并非昙花一现.本教程旨在传播和普及STL的基础知识,若能借此机 ...
- C++——对象和类
最重要的OOP特性: *抽象: *封装和数据隐藏: *多态: *继承: *代码的可重用性: 一.抽象和类 1.类型 指定基本类型完成了三项工作:1).决定数据对象需要的内存数量:2).决定如何解释内存 ...
- C++ STL编程轻松入门基础
C++ STL编程轻松入门基础 1 初识STL:解答一些疑问 1.1 一个最关心的问题:什么是STL 1.2 追根溯源:STL的历史 1.3 千丝万缕的联系 1.4 STL的不同实现版本 2 牛刀小试 ...
随机推荐
- MySQL Error Code文档手册---摘自MySQL官方网站
This chapter lists the errors that may appear when you call MySQL from any host language. The first ...
- Markdown基本语法规范
1. 标题 #的个数即表示Hn, 一下依次从h1~h6. 也可在句尾添加同样个数的#(也可忽略) # This is H1 ## This is H2 ### This is H3 #### Thi ...
- javascript:void(0)的问题
最近看了好几个关于<a>标签和javascript:void(0)的帖子,谨记于此,以资查阅. 注:以下代码未经全面测试,但每一种方法可能会出现的情况都基本做了说明. 在做页面时,如果想做 ...
- mysql主从复制亲测,以及注意事项
本人亲测,windows作为mysql主服务器,linux作为从服务器,使用两个linux配置步骤都一样,测一遍而已:区别配置文件在于windwos是my.ini.linux在/etc/my.cof ...
- 多线程之CAS
在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁 锁机制存在以下问题: (1)在多线程竞争下,加锁.释放锁会导致比较多的上下文切换和调度延时,引起性能问题. (2 ...
- ubuntu16.04下的htk安装编译
HTK(HMM Tools Kit)是一个剑桥大学开发的专门用于建立和处理HMM的实验工具包[1],主要应用于语音识别领域,也可以应用于语音合成.字符识别和DNA排序等领域.HTK经过剑桥大学.Ent ...
- Python2.7-csv
csv模块,用于读写 csv 文件,常用 reader 和 writer 对象进行操作 1.模块的类 1.1 Dialect 对象,设置 csv 文件的各种格式,包括分隔符,引用符,转义符等 1.1. ...
- libgdx学习记录4——舞台Stage
libgdx总的来说是一个框架,而不是一个成熟的游戏引擎.Stage是其中一个比较好的封装,里面自带Camera.SpriteBatch等常用渲染绘图工具. 下面是一个简单的添加图片,并让镜头左右上下 ...
- Centos7下vim的table键修改为4个空格
1.要有root用户权限 2.已经安装vim 3.编辑/etc/vim/vimrc 文件,添加set ts=4 vim /etc/vimrc #按大写G到最后一行,添加set ts= set ts = ...
- [HNOI2018]转盘[结论+线段树]
题意 题目链接 分析 首先要发现一个结论:最优决策一定存在一种 先在出发点停留之后走一圈 的情况,可以考虑如下证明: 如果要停留的话一定在出发点停留,这样后面的位置更容易取到. 走超过两圈的情况都可以 ...