C++总结—基础

news/2024/6/29 12:02:20 标签: c++, 编译器, c, 语言, 存储, null
cle class="baidu_pl">
cle_content" class="article_content clearfix">
content_views" class="htmledit_views">   一般而言࿰c;C++语言糅合了面向过程࿰c;面向对象以及泛型三种思想。这三种思想既有相辅相成的一面也有互相矛盾的一面࿰c;这就使得C++成为常用编程语言中最复杂的高级语言。我们的总结也从这三方面来展开。
1࿰c;C++与C

C++之所以保留面向过程࿰c;是为了兼容C࿰c;以保证大部分C代码࿰c;无需修改就可以在通过C++class="tags" href="/tags/BianYiQi.html" title=编译器>编译器的编译。但是两者也是有很多的区别的࿰c;这里简单列一些比较常见的区别:

color:rgb(51,51,51); font-family:宋体; font-size:14px; line-height:28px; background-color:rgb(248,248,248)">(1)在C中,如果类型声明语句中没有指定类型名,该类型被假定成int,这种隐式转型在C99与C++中是不允许的;

color:rgb(51,51,51); font-family:宋体; font-size:14px; line-height:28px; background-color:rgb(248,248,248)">color:rgb(51,51,51); font-family:宋体; font-size:14px; line-height:28px; background-color:rgb(248,248,248)">(2)字符常数在C中被自动作为整形来处理,但在C++中则不是;

color:rgb(51,51,51); font-family:宋体; font-size:14px; line-height:28px; background-color:rgb(248,248,248)">color:rgb(51,51,51); font-family:宋体; font-size:14px; line-height:28px; background-color:rgb(248,248,248)">(3)color:rgb(51,51,51); font-family:宋体; font-size:14px; line-height:28px; background-color:rgb(248,248,248)">int func()在C++中一般被编译为color:rgb(51,51,51); font-family:宋体; font-size:14px; line-height:28px; background-color:rgb(248,248,248)">int func(void);

color:rgb(51,51,51); font-family:宋体; font-size:14px; line-height:28px; background-color:rgb(248,248,248)">color:rgb(51,51,51); font-family:宋体; font-size:14px; line-height:28px; background-color:rgb(248,248,248)">color:rgb(51,51,51); font-family:宋体; font-size:14px; line-height:28px; background-color:rgb(248,248,248)">color:rgb(51,51,51); font-family:宋体; font-size:14px; line-height:28px; background-color:rgb(248,248,248)">(4)color:rgb(51,51,51); font-family:宋体; font-size:14px; line-height:28px; background-color:rgb(248,248,248)">在C++中,可以获得register型的地址,既寄存器地址࿰c;而在C中不可以获得这种地址;


2࿰c;C++基础定义

(1)指针

指针是一个特殊的变量࿰c;它里面存储的数值被解释成为内存里的一个地址。 要搞清一个指针需要搞清指针的四方面的内容:指针的类型࿰c;指针所指向的 类型࿰c;指针的值或者叫指针所指向的内存区࿰c;还有指针本身所占据的内存区。

如:int* ptr 指针的类型是int*࿰c;指针指向的类型是int࿰c;指针的值࿰c;既它所指向的内存区是int型的值࿰c;指针本身所占的内存大小在32位机下是32.

这里需要注意的是:指针所指向的变量的生存期要不短于指针本身的生存期。

    引用和指针有如下三种区别:
    a 引用必须在声明时初始化࿰c;而指针不用;
    b 对于NULL不能引用࿰c;而指针可以指向NULL;
    c 引用一旦声明࿰c;引用的对象不能改变(但对象的值可以改变);而指针可以随时改变指向的对象。
    由此可知:引用能做到的࿰c;指针也可以࿰c;但指针更危险;


(2)内联函数
   a,内联函数是真正的函数࿰c;只是在需要用到的时候࿰c;内联函数像宏一样的展开࿰c;所以取消了函数的参数压栈࿰c;减少了调用的开销。
   b, 在C++中࿰c;在类的内部定义了函数体的函数࿰c;被默认为是内联函数。而不管你是否有inline关键字。
   c,内联函数在C++类中࿰c;应用最广的࿰c;应该是用来定义存取函数。我们定义的类中一般会把数据成员定义成私有的或者保护的࿰c;这样࿰c;外界就不能直接读写我们类成员的数据了。对于私有或者保护成员的读写就必须使用成员接口函数来进行。如果我们把这些读写成员函数定义成内联函数的话将会获得比较好的效率.
   d, 内联函数也有一定的局限性。就是函数中的执行代码不能太多了࿰c;如果࿰c;内联函数的函数体过大࿰c;一般的class="tags" href="/tags/BianYiQi.html" title=编译器>编译器会放弃内联方式࿰c;而采用普通的方式调用函数。


(3)类型转换

reinterpret_cast 将一个类型指针转换为另一个类型指针 
const_cast    用于去除指针变量的常属性࿰c;将它转换为一个对应指针类型的普通变量࿰c;反过来也可以将一个非常量指针转换为一个常量指针变量 
static_cast    用于转换基本类型和具有继承关系的类新之间转换,不太用于指针类型的之间的转换 
dynamic_cast    只能在继承类对象的指针之间或引用之间进行类型转换 


(4)宏

C++ 宏定义将一个标识符定义为一个字符串࿰c;源程序中的该标识符均以指定的字符串来代替。++提供的编译预处理功能主要有以下三种: 宏定义࿰c; 文件包含࿰c;条件编译。

eg: 宏定义:  #define AREA (PI*R*R);

      文件包含:    #include

    条件编译:#ifndef MAIN_H_

ckquote style="margin:0 0 0 40px; border:none; padding:0px"> ckquote style="margin:0 0 0 40px; border:none; padding:0px">

#define MAIN_H_

ckquote>
ckquote> ckquote style="margin:0 0 0 40px; border:none; padding:0px"> ckquote style="margin:0 0 0 40px; border:none; padding:0px">

其它内容

#endif

ckquote>
ckquote> ckquote style="margin:0 0 0 40px; border:none; padding:0px"> ckquote style="margin:0 0 0 40px; border:none; padding:0px">


 (5)内存分配

一般认为在c++中分为这几个存储区 

1栈   -   有class="tags" href="/tags/BianYiQi.html" title=编译器>编译器自动分配释放   
2堆   -   一般由程序员分配释放࿰c;若程序员不释放࿰c;程序结束时可能由OS回收   
3全局区(静态区)࿰c;全局变量和静态变量的存储是放在一块的࿰c;初始化的全局变量和静态变量在一块区域࿰c;未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。-   程序结束释放   
4另外还有一个专门放常量的地方。   -   程序结束释放 

 在函数体中定义的变量通常是在栈上࿰c;用malloc,   calloc,   realloc等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量࿰c;加了static修饰符后不管在哪里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效࿰c;不能extern到别的文件用࿰c;在函数体内定义的static表示只在该函数体内有效



ckquote>
ckquote>

3࿰c;面向对象


4࿰c;泛型与STL


5࿰c;C++的库

cle>

http://www.niftyadmin.cn/n/1617954.html

相关文章

挑战极限—极限编程中的“极限”

最近,一直在看Robert Martin的《敏捷软件开发—原则、模式和实践》,该文中以极限编程(XP)来讲述敏捷的实践。看完有关于XP实践的部分,对XP基本的主张和如何去实践有了一个大概的了解。但是,一直有个问题在我…

C++总结—面向对象

C很多时候被认为是“C with Class”,事实上,C引入了完整的面向对象思想,并且为支持这种思想增加了很多基础结构。 类与结构体 C中的类和结构体是非常相似的。 C的继承 C中没有接口的关键字,但是有接口的思想。事实上一个纯虚函数…

Blackberry UI框架

在黑莓原生的UI框架里,所有的UI组件都是Field,这里的Filed代表一个占据一个矩形空间的物件。自定义的UI组件必须是Field的子类或子类的子类。 黑莓的UI有个特性就是默认其大小是不固定的,它不提供类似setSize(),resize()之类的函数&#xff0…

DirectShow 设计思想

DirectShow 建立在COM基础上,是针对流数据的处理的解决方案。 Filter的高级抽象与低级抽象:高级抽象面向组件,每个Filter都是一个组件,低级抽象面向对象,每个Filter内部都有相应的功能类,具有相应的职责。与…

Blackberry 10 特性与开发相关知识

最近,RIM在黑莓开发者大会上强势推出了Blackberry 10。我将网上搜集到一些关于Blackberry 10 新特性和开发相关知识整理后分享给大家。 Blackberry 10的一些新特性: 全新的UI:炫酷且实用 BlackBerry 10 的主界面是四个类似 Windows …

敏捷软件开发:原则、模式和实践

1,敏捷宣言和原则 1.1 敏捷宣言 敏捷联盟在敏捷大会上发布了他们最主要的主张,称之为敏捷宣言。其主要表述如下: 1,个人和交互胜过过程与工具 2,可以工作的软件胜过面面俱到的文档 3,客户合作胜过合同…

Java 优雅的终止线程

Java中原来在Thread中提供了stop()方法来终止线程,但这个方法是不安全的,所以一般不建议使用。《Java多线程模式》中有一种叫Two-Phase Termination(两步终止)的模式可以优雅的终止线程。 首先在线程中设置一个标志位:…

Java 类的加载

导致类的加载的几种情况 查阅了虚拟机相关的资料,了解到在首次主动使用类,会导致类的加载,包括以下的几种情况: l 类的实例被创建:new 语句、反射、clone、反序列化; l 调用类的静态方法; l 读或…