c/c++笔记

来源:互联网 发布:阿里云属于混合云 编辑:程序博客网 时间:2024/06/05 08:35
内建数据类型的情况下,效率没有区别
自定义数据类型的情况,++i的效率较高


c++和c有什么不同
1. C是一个结构化语言,它的重点在于算法和数据结构。对语言本身而言,c是c++的子集。c程序的设计首要
考虑的是如何通过一个过程,对输入进行运算处理,得到输出。对于c++,首要考虑的是如何构建一个对象
模型,让这个模型能够配合对应的问题,这样就可以通过对象的状态信息得到输出或实现过程控制。因此,
c与c++的最大区别在于,它们用于结交问题的思想方法不一样。
2. C实现了c++的过程化控制及其他相关功能。而在c++中的c,相对于原来的c还有所加强,引入了重载,内联
函数,异常处理等。c++更是拓展了面向对象设计的内容,如类,继承,虚函数,模板和包容器类等。
3. 在C++中,不仅需要考虑数据封装,还需要考虑对象粒度的选择,对象接口的设计和继承,组合与继承
的使用等问题
4. 相对于c,c++包含了更丰富的设计概念。
总结:c是面向过程化的,但是c++不是完全面对对象化的。在c++中也完全可以写出与c一样过程化的程序,
所以只能说c++拥有面向对的特性。java是真正面对对象化的


说明const和#define的特点和区别
#define常量是一个Compile-Time概念,它的生命周期止于编译期,它存在于程序的代码段,在实际程序中
它只是一个常量,一个命令的参数,并没有实际存在
const常量存在于程序的数据段,并在堆栈分配了空间。const常量是一个Run-Time的概念,它在程序中
确确实实的存在着并被调用,传递。const常量有数据类型,而宏没有数据类型。编译器可以对const常量
进行类型安全检查


c++中的const有什么作用
1.const用于定义常量:const定义的常量编译器可以对其进行数据静态类型安全检查
2.const修饰函数形式参数
3.const修饰函数的返回值
4.const修饰类的成员函数:任何不会修改的数据成员的函数都应用const修饰,这样,当不小心修改了
数据成员或调用了非const函数时,编译器会报错


static有什么作用
在c语言中,关键字static有3个明显的作用:
1.在函数体,一个被声明为静态的变量在这一函数被调用的过程中维持其不值不变。
2.在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所有函数访问,但不能被模块外其他
函数访问。它是一个本地的全局变量
3.在模块内,一个被声明为静态的函数只可被这个模块的其他函数调用。那就是这个函数被限制在声明
它的模块的本地范围内使用。


static全局变量和普通全局变量有什么区别
1.static全局变量与普通全局变量的区别是,static全局变量只初始化一次,防止在其他文件的单元被引用
2.static全局变量和普通局部变量的区别是,static局部变量只被初始化一次,下一次依据上一次结构值
3.static函数与普通函数的区别是,static函数在内存中只有一份,普通函数在每个被调用中维持一份复制品


sizeof和strlen的区别
1.sizeof是操作符,strlen是函数
2.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsignedint类型,该类型保证能容纳实现所建立
的最大对象的字节大小
3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须用‘\0’结尾
4.数字做sizeof的参数不退化,传智给strlen就退出指针了
5.大部分编译程序在编译的时候sizeof就被计算过的,这就是sizeof(x)可以用来定义数组维数的原因。strlen
的结果要在运行的时候才能计算出来,它用来计算字符串的长度,不是类型占内存的大小
6.如何要计算指针指向的字符串的长度,则一定要使用strlen


sizeof的用途
1.与存储分配和I/O系统那样的例程进行通信
2.查看某个类型的对象在内存中所占的单元字节
3.在动态分配一个对象时,可以让系统知道要分配多少内存
4.便于一些类型的扩充,在windows中有很多结构类型就有一个专有的字段是用来该类型的字节大小
5.由于操作数的字节数在实现时可能出现变化,建立在涉及操作数字节大小时用sizeof来代替常量计算


#pragma pack(x)的作用,是使内存的对齐方式以x的整数倍对齐


为什么inline能很好的取代表达式形式的预定义
1.inline定义的类的内联函数,函数的代码被放入符号表中,在使用时直接进行替代(像宏一样展开),
没有了调用的开销,效率很高
2.类的内联函数也是一个真正的函数,编译器在调用一个内联函数时,首先会检查它的参数的类型,保证
调用正确;然后进行一系列的相关检查,就像对待任何一个真正的函数一样。这样就消除了它的隐患和局限性
3.inline可以作为某个类的成员函数,当然就可以在其中使用所在类的保护成员及私有成员


为什么不把所有的函数都定义成内联函数
1.如何函数体内的代码比较长,使用内联将导致内存消耗代价较高
2.如何函数体出现循环,那么执行函数体内代码的时间要比函数调用的开销大
3.类的构造函数和析构函数容易让人误解成使用内联更有效。要当心构造函数和析构函数可能会隐藏一些
行为,如"偷偷地"执行了基类或成员对象的构造函数和析构函数




内联函数和宏的区别
1.内联函数咋编译时展开,宏在预编译时展开
2.在编译时,内联函数可以直接被镶嵌到目标代码中,而宏只是一个简单的文本替换
3.内联函数可以完成诸如类型检查,语句是否正确等编译功能,宏就不具有这样的功能
4.宏不是函数,inline函数时函数
5.宏在定义要小心处理宏参数(一般情况下是把参数用括号括起来),否则容易出现二义性。而内联函数
定义时不出现二义性


指针和引用的区别
1.初始化要求不同。引用在创建的同时必须初始化,即引用到一个有效的对象;而指针在定义的时候不必
初始化,可以在定义后面的任何地方重新赋值
2.可修改性不同。引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用;而指针在任何时候都可以改变为指向另一个对象。给引用赋值并不是改变它和原始对象的绑定关系。
3.不存在NULL引用,引用不能使用指向空指的引用,它必须总是指向某个对象;而指针则可以是NULL,不需要总是指向某个对象,可以把指针指向任意的对象,所以指针更加灵活,也容易出错
4.测试需要的区别。由于引用不会指向空指,这意味着使用引用之前不需要测试它的合法性;而指针则需要经常测试。因此使用引用的代码效率比使用指针的要高
5.应用的区别。如果是指一旦指向一个对象后就不会改变指向,那么应该使用引用。如果有存在指向NULL或在不同的时刻指向不同的对象这些可能性,应该使用指针


指针常量和常量指针的区别
常量指针就是指向常量的指针,它所指向的地址的内容是不可修改的
指针常量就是指针的常量,它是不可改变的地址的指针,但是可以对它所指向的内容进行修改


什么是"野指针"
"野指针"不是NULL指针, 而是指向"垃圾"内存的指针.其成因主要为:指针变量没有被初始化,或指针p被free
或者delete之后, 没有置为NULL


有了malloc/free, 为什么还要new/delete
malloc与free是C/C++的标准库函数,new/delete是C++的运算符。它们都可用申请动态内存和释放内存。
对于非内部数据类型的对象而言, 对象在消亡之前要自动执行析构函数.由于malloc/free是库函数而不是
运算符,不在编译器控制权限之内, 不能把执行构造函数和析构函数的任务强加于malloc/free,因此只
使用new/delete


各种内存分配和释放的函数的联系和区别
C语言的标准分配函数:malloc,calloc, realloc,free等
malloc和calloc的 区别为1块与n块的区别
malloc的调用形式为(类型*)malloc(size):在内存的动态存储中分配一块长度为"size"字节的连续区域,
返回该区域的首地址, 此时内存中的值没有初始化,是一个随机数
calloc的调用形式为(类型*)calloc(n, size):在内存的动态存储区域中分配n块长度为"size"字节的连续区域
返回首地址,此时内存中的值都被初始化为0
realloc的调用形式为(类型*)realloc(*ptr, size):将ptr内存大小增加到size,新增加的内存没有初始化
free的调用形式为free(void*ptr):释放ptr所指向的一块内存空间
C++中,new和delete函数可以调用类的析构函数和构造函数


内存的分配方式
1.从静态区域分配。内存在程序编译的时候就已经分配好了,这块内存在程序整个运行期间都存在,例如
全局变量
2.在栈上创建。在执行函数时, 函数内部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元
自动被释放。处理器的指令集中有关栈内存的分配运算符,因此效率很高,但是分配的内存容量有限
3.从堆上分配,亦称为动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己
负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多


strcpy和memcpy的区别
1.复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组,整型,结构体等
2.复制的方法不用。strcpy不需要指定长度,它是遇到字符串结束符'\0'而结束。memcpy则是根据其第三个
参数决定复制的长度
3.用途不同。通常在复制字符串时用strcpy;而若需要复制其他类型数据,则一般用memcpy









































0 0
原创粉丝点击