C++初始

写在前面

C++是一种大型的编程语言,这可能会吓倒一些新手。现代 C++ 可以看成由以下三部分组成:

• 低级语言,多半继承自 C。
• 更高级的语言特征,用户可以借此定义自己的数据类型,组织大规模的程
序和系统。
• 标准库,使用上述高级特征提供一整套有用的数据结构和算法。

面向对象的三大基本特征

  1. 封装:将客观事物抽象成类,每个类对自身的数据和方法进行操作实行 protection (private,protected,public)

2.继承:广义的继承有三种实现形式
1. 实现继承:(指使用基类的属性和方法而无需额外编码的能力)
2. 可视继承:(子窗体使用父窗体的外观和实现代码)
3. 接口继承:(仅使用属性和方法,实现滞后到子类实现)
前两种(类继承)和后一种(对象组合==>接口继承以及纯虚函数)构成了功能复用的两种方式。

3.多态:子类指针指向父类对象(iOS篇)。将父类对象设置成为和一个或更多的与他的子类对象特性以不同的方式运作。

1. 隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用;
2. 接口重用:为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确调用。

C和C++的区别和联系

  • 从机制上说,C是面向过程的,C++是面向对象的,并且提供了类
  • 从性能上说,C适合代码小的,效率高的,如嵌入式;C++更偏向于上层,复杂的;Linux大部分是C提供的,因为它是系统级别的,有高效性的需求
  • 从名称上说,C++比C多+,C++是的超集,并且C++相对于C来说,扩展的东西太多
  • C++是面向对象的,更强调是类的设计而不是逻辑的设计

C++中函数值的传递方式

值传递、指针传递、引用传递

C++中Virtual与inline的含义

在基类成员函数的声明前加上virtual关键字,意味着将该成员函数声明为虚函数。inline与函数的定义体放在一起,使函数称为内联。inline是一种用于实现的关键字,而不是用于声明的关键字。

  • 虚函数的特点:如果派生类能够重新定义基类的方法,则在基类中将该方法定义为虚函数(virtual),这样可以启用动态联编
  • 内联函数的特点:使用内联函数是为了提高函数的运行效率。内联函数不能太长,不能包含循环体,因为执行循环体要比调用函数开销大(inline)
//MapObj.h
#ifndef __BUILDING__H
#define __BUILDING__H

#include "MapObj.h"

struct SModelBld;

class CBuilding: public CMapObj
{
  public :
     Building();
     virtual BOOL lnit(SlintBase *pObjlnit) ;
     virtual BOOL Build(void *p);  ————>该派生类CBuilding重新定义基类CMapObj 中的Build方法,则在基类中将该方法定义为虚函数(virtual),这样可以启动动态联编
  protected:
     void PutOccupied();
     SModeBld  m_pModel;
}


#endif

/*
#ifndef  HHKDM
#define BJ


#endif
*/

C++开发中常用工具

AppCode :构建与JetBrains’ IntelliJ IDEA 平台上的用于Objective-C,C,C++,Java和Java开发的集成开发环境
CLion:来自JetBrains的跨平台的C/C++的集成开发环境
Code::Blocks :免费C,C++和Fortran的集成开发环境
CodeLite :另一个跨平台的免费的C/C++集成开发环境
Dev-C++:可移植的C/C++/C++11集成开发环境
Eclipse CDT:基于Eclipse平台的功能齐全的C和C++集成开发环境
Geany :轻量级的快速,跨平台的集成开发环境。
IBM VisualAge :来自IBM的家庭计算机集成开发环境。
Irony-mode:由libclang驱动的用于Emacs的C/C++微模式
KDevelop:免费开源集成开发环境
Microsoft Visual Studio :来自微软的集成开发环境
NetBeans :主要用于Java开发的的集成开发环境,也支持其他语言,尤其是PHP,C/C++和HTML5。
Qt Creator:跨平台的C++,Javascript和QML集成开发环境,也是Qt SDK的一部分。
rtags:C/C++的客户端服务器索引,用于 跟基于clang的emacs的集成
Xcode :由苹果公司开发
YouCompleteMe:一个用于Vim的根据你敲的代码快速模糊搜索并进行代码补全的引擎。
构建系统
Bear :用于为clang工具生成编译数据库的工具
Biicode:基于文件的简单依赖管理器。
CMake :跨平台的免费开源软件用于管理软件使用独立编译的方法进行构建的过程。
CPM:基于CMake和Git的C++包管理器
FASTBuild:高性能,开源的构建系统,支持高度可扩展性的编译,缓冲和网络分布。
Ninja :专注于速度的小型构建系统
Scons :使用Python scipt 配置的软件构建工具
tundra :高性能的代码构建系统,甚至对于非常大型的软件项目,也能提供最好的增量构建次数。
tup:基于文件的构建系统,用于后台监控变化的文件。
静态代码分析
提高质量,减少瑕疵的代码分析工具列表
Cppcheck :静态C/C++代码分析工具
include-what-you-use :使用clang进行代码分析的工具,可以#include在C和C++文件中。
OCLint :用于C,C++和Objective-C的静态源代码分析工具,用于提高质量,减少瑕疵。
Clang Static Analyzer:查找C,C++和Objective-C程序bug的源代码分析工具

在VC中,编译工具条内Debug与Release选项

  • Debug:统称为调试版本,包含调试信息,不做任何优化,便于程序员调试程序。
  • Release;称为发布版本,往往是进行各种优化,以便用户更好的使用

引用和指针

  • 引用被创建的同时必须被初始化(在OC语言中对象初始化一个原理,Person *p = [[Person alloc ]init]在Person对象创建时,就已经初始化和分配内存),指针则可以任何时候被初始化
  • 不能有NULL引用,引用必须与合法的存储单元关联(指针可以是NULL)
  • 一旦引用被初始化,就不能改变引用关系(指针可以随时改变所指的对象)

有了malloc/free但还需要new/delete

  • malloc与free是C/C++语言的标准库函数,new/delete是C++的运算符。
  • 她们都用于申请动态内存和释放内存,对于内部数据的对象而言,光用malloc和free无法满足动态对象的需求,对象在创建的同时要自动执行构造函数,对象在消失之前要自动执行析构函数。
  • 由于malloc/free是库函数不是元素符,不在编译器控制权限内,不能把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及能够完成清理与释放内存工作的运算符delete️new/delete不是库函数,是运算符

用C++写一个程序,如何判断一个操作系统是16位还是32位

  1. 定义指针p,打印出sizeof(p),结果是4,则是32位操作系统,结果是2,则是6位操作系统
int a=0;
if(a>65536)
{
      count<<"32 bit"<

函数指针

  1. void((fp1)(int))[10]:fp1是个指针,指向一个函数,这个函数的参数为int型,函数返回值是一个指针,这个指针指向一个数组,这个数组10个元素,每个元素是一个void型指针
  2. float((fp2)(int,int,int))(int):fp2是个指针,指向一个函数,这个函数的参数为3个int型,函数的返回值是一个指针,这个指针指向一个函数,这个函数的参数为int型,函数的返回值是float型 「float(*p)(int) p=[(*fp2)(int,int,int)]」
  3. int((fp3)())10:fp3是一个指针,指向一个函数,这个函数的参数为空,函数的返回值是一个指针,这个指针指向一个数组,这个数组有10个元素,每个元素是一个指针,指向一个函数,这个函数的参数为空,函数返回值是int型

内存分配的方式

1.静态存储区域分配:内存在编译的时候已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量

  1. 在栈上创建:执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束这些存储单元自动被释放,栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限
    3.从堆上分配:亦称动态内存分配。程序在运行的时候用malloc/new申请任意多少的内存,程序员自己负责在何时用free/delete释放内存。动态内存的生存期有我们决定。使用灵活但是问题最多。

全局变量和局部变量

  • 声明周期:全局变量随主程序创建而创建,随主程序的销毁而销毁;局部变量在局部函数内部,甚至局部循环体等内部存在,推出布局函数或则循环体局部变量久不存在了;内存中分配在全局数据区。
  • 使用方式:通过声明后全局变量程序的各个部分都可以用到;局部变量只能在局部使用;分配在栈区。
  • 操作系统和编译器通过内存分配的位置知道的,全局变量分配在全局数据段并且在程序开始运行的时候被加载。局部变量则分配在堆栈里 面。

堆栈、静态区动态区、静态库动态库

栈(stack):是向低地址扩展的数据结构,是一块连续的内存区域。意义是栈顶的地址和系统最大容量预先有系统设定。由于栈是先进后出的队列(安全),所以不存在内存泄漏。
堆(heap):是向高地址扩展的数据结构,是不连续的一块内存区域。系统是用链表存储的空闲内存地址,堆的大小受限于系统有效的虚拟内存。
碎片问题:堆会频繁的new/delete 自然会产生碎片,而栈是先进后出 一一对应,不存在碎片问题。
分配方式:堆都是动态分配的。栈有静态和动态分配。静态分配是编译器分配的 比如:局部变量的分配,动态分配是由alloc函数分配。但是栈的动态分配是由编译器释放,不用人手动释放。
内存分区情况(iOS篇):
静态库:.a .framework 在项目中使用静态库,在进行编译静态库会和代码链接生成目标文件,这样会导致编译后的目标文件过大,但因为链接到一起了使用静态库函数时 不用再加载其他函数库。
动态库:.dylib .framework 在编译时不会和代码链接到一块,这样编译后的目标文件比较小,但使用动态库函数时需提前加载函数库(项目工程-Build Phases-Copy Buildle Resoce 手动添加)自己手动建立动静态库

Heap(堆) stack(栈):

stack的空间由操作系统自动分配/释放,heap程序员手动分配和释放。
stack空间有限,heap是很大的自由存储区
C中的malloc函数分配的内存空间即在堆上,C++对应的是new操作符
程序在编译期对变量和函数分配内存在栈上进行,且程序运行过程中函数调用时参数的传递也在栈上进行

static静态变量(iOS篇):需要一个数据为整类而非某个对象使用,同时具有封装性。要求此成员隐藏在内部,对外不可见。
优点:节省内存。只存储一次,供所有对象使用
值可更新。
提高效率。某个对象对值修改一次,所有对象都能使用新的值。

单例
//单例(iOS)
+(instancetype)sharedManager {    
       static PlayManager *handle = nil;    
       static dispatch_once_t onceToken;    
       dispatch_once(&onceToken, ^{           
       handle = [[PlayManager alloc]init];     
   });    
        return handle;
}
//UITableView 加载cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
      static NSString *CellIdentifier = @"Cell";
      UITableViewCell *cell = [tableViewdequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
      return cell;
}

这里定义的static变量在编译时决定其类型,只有在方法cellForRowAtIndexPath下才可以访问。

extern全局变量:也称为外部变量,是在方法外部定义的变量。它不属于哪个方法,而属于整个源程序。
局部变量:方法内定义说明,作用域仅限于方法内。
** 实例变量**:在类中定义的实例变量,可以在各个方法中使用。
const:变量值不可变。const int a;a是个长整数
volatile:变量随时改变
**static关键字区别:**
static全局变量和普通全局变量有什么区别:static全局变量只初始化一次,防止在其他文件单元中被引用。
static局部变量和普通局部变量有什么区别:static变量只初始化一次,下次使用上次结果值。
static函数和普通函数有什么区别:static函数只有一份内存,普通函数在每次调用时都会被copy一次。

C++中析构函数和虚函数用法

析构函数:是特殊的类成员函数,它没有返回值,没有参数,不能随意调用,也没有重载,只有在类对象的声明周期结束的时候,由系统自动调用。有释放内存空间的作用。
虚函数:是C++多态的一种表现,使用虚函数,我们可以灵活的进行动态绑定,当然是以一定的开销为代价。

C++初始_第1张图片
code

C++虚函数与多态的关系
在面向对象中的程序设计中,经常会用到类的继承,且保留基类的特性,以减少开发时间

C++内联函数

你可能感兴趣的:(C++初始)