c知识点


西游记歇后语 2019-10-08 09:32:55 西游记歇后语
[摘要]c知识点篇一:C 知识点一、 include “filename h”和 include 的区别 include “filename h”是指编译器将从当前工作目录上开始查找此文件 include 是指编译器将从标准库目录中开始查找此文件二、头文件

【www.shanpow.com--西游记歇后语】

c知识点篇一:C 知识点


一、#include “filename.h”和#include <filename.h>的区别
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件
#include <filename.h>是指编译器将从标准库目录中开始查找此文件
 二、头文件的作用
    加强安全检测
    通过头文件可能方便地调用库功能,而不必关心其实现方式
 三、* , &修饰符的位置
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名
四、if语句
不要将布尔变量与任何值进行比较,那会很容易出错的。
整形变量必须要有类型相同的值进行比较
浮点变量最好少比点,就算要比也要有值进行限制
指针变量要和NULL进行比较,不要和布尔型和整形比较
 五、const和#define的比较
const有数据类型,#define没有数据类型
个别编译器中const可以进行调试,#define不可以进行调试
在类中定义常量有两种方式
1、  在类在声明常量,但不赋值,在构造函数初始化表中进行赋值;
2、  用枚举代替const常量。
 六、C++函数中值的传递方式
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference)
void fun(char  c)  //pass by value
void fun(char  *str)  //pass by pointer
void fun(char &str)  //pass by reference
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构
函数的类型不能省略,就算没有也要加个void
 七、函数体中的指针或引用常量不能被返回
Char *func(void)
{
char str[]=”Hello Word”;
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉
return str;
}
函数体内的指针变量并不会随着函数的消亡而自动释放
 
 八、一个内存拷贝函数的实现体
void  *memcpy(void *pvTo,const void *pvFrom,size_t size)
{
assert((pvTo!=NULL)&&(pvFrom!=NULL));
byte *pbTo=(byte*)pvTo;    //防止地址被改变
byte *pbFrom=(byte*)pvFrom;
while (size-- >0)
  pbTo++ = pbForm++;
return pvTo;
}
 九、内存的分配方式
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题
1、  静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。
2、  栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。
3、  堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。
 
 十、内存分配的注意事项
用new或malloc分配内存时,必须要对此指针赋初值。
用delete 或free释放内存后,必须要将指针指向NULL
       不能修改指向常量的指针数据
 十一、内容复制与比较
//数组……
char a[]=”Hello Word!”;
char b[10];
strcpy(b,a);
if (strcmp(a,b)==0)
{}
//指针……
char a[]=”Hello Word!”;
char *p;
p=new char[strlen(a)+1];
strcpy(p,a);
if (strcmp(p,a)==0)
{}
 
十二、sizeof的问题
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节
char a[]=”Hello World!”
char *p=a;
count<<sizeof(a)<<end;    //12字节
count<<sizeof(p)<<endl;   //4字节
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4
void fun(char  a[1000])
{
count<<sizeof(a)<<endl;  //输出4而不是1000
}
 
十三、关于指针
1、  指针创建时必须被初始化
2、  指针在free 或delete后必须置为NULL
3、  指针的长度都为4字节
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如
char *p=new char[100];
strcpy(p,”Hello World”);
delete []p;   //注意前面的[]号
p=NULL;
5、数组指针的内容不能超过数组指针的最大容易。
如:
char *p=new char[5];
strcpy(p,”Hello World”);  //报错  目标容易不够大
delete []p;   //注意前面的[]号
p=NULL;
 
十四、关于malloc/free 和new /delete
l         malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。
l         注意:malloc/free是库函数,new/delete是运算符
l         malloc/free不能执行构造函数与析构函数,而new/delete可以
l         new/delete不能在C上运行,所以malloc/free不能被淘汰
l         两者都必须要成对使用
l         C++中可以使用_set_new_hander函数来定义内存分配异常的处理
 
十五、C++的特性
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制
重载和内联:即可用于全局函数,也可用于类的成员函数;
Const和Virtual:只可用于类的成员函数;
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。
覆盖是指派生类函数覆盖基类函数
函数名相同;
参数相同;
基类函数必须有Virtual关键字;
不同的范围(派生类和基类)。
隐藏是指派生类屏蔽了基类的同名函数相同
1、  函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。
2、  函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
1、  参数做输入用的指针型参数,加上const可防止被意外改动。
2、  按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如:
将void Func(A a) 改为void Func(const A &a)。
而void func(int a)就没必要改成void func(const int &a);
3、  给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。
4、  Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体;
 
十六、extern“C”有什么作用?
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。
 
十七、构造函数与析构函数
派生类的构造函数应在初始化表里调用基类的构造函数;
派生类和基类的析构函数应加Virtual关键字。
不要小看构造函数和析构函数,其实编起来还是不容易。
#include <iostream.h>
class Base
{
  public:
    virtual ~Base() { cout<< "~Base" << endl ; }
};
class Derived : public Base
{
  public:
    virtual ~Derived() { cout<< "~Derived" << endl ; }
};
void main(void)
{
    Base * pB = new Derived;  // upcast
    delete pB;
}
输出结果为:
       ~Derived
       ~Base
如果析构函数不为虚,那么输出结果为
       ~Base
 
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用
仿止该头文件被重复引用
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=644473

c知识点篇二:【原】C++知识点梳理

C++重点、易错知识点整理
 
作者: 图灵图书馆
第一章
1、泛型程序设计是指向程序中数据类型中加入类型参数的一种能力,也称为参数化的类型或参数多态性。
2、c++程序开发通常要经过5个阶段,包括编辑、预处理、编译、连接、运行与调试。
3、编译过程分为词法分析、语法分析、代码生成这3个步骤。
4、使用名字空间std的方法有3种:
   1、利用using namespace使用名字空间;使用方法如下:
     
   2、用域分辨符::为对象分别指定名字空间;例如:
     
   3、用using与域分辨符指定名字空间;例如:
     
5、c++中常用操作符:
 
第二章
1、c++的数据类型:
        
2、在定义变量的同时赋初值还有另外一种方法,就是在变量后面将初值放在括号中,格式如下:
3、常变量定意格式:

   ※在定义常变量时,一定要赋初值,且在程序中间不能更新其值。
4、常量和非左值表达式是没有内存地址的。
5、在逻辑表达式求值中注意短路求值。
6、运算符优先级的规律:
   (1)运算符的优先级按单目、双目、三目、赋值依次降低;
   (2)算术、移位、关系、按位、逻辑运算的优先级依次降低。
7、标准c++提供了新式的强制类型转换运算,格式如下:
  
   ※static_cast用于一般表达式的类型转换;
   ※reinterpret_cast用于非标准的指针数据类型转换,如将void*转换成char*;
   ※const_cast将const表达式转换成非常量类型,常用于将限制const成员函数的const定义解除;
   ※dynamic_cast用于进行对象指针的类型转换。
第三章
第四章
1、内联函数的定义必须出现在对该函数的调用之前。
2、递归函数不能定义为内联函数。
3、说明一个内联函数只是请求而不是命令编译器对它进行扩展。
带有默认形参值的函数:
1、  若函数具有多个形参,则默认形参值必须自右向左连续的定义,并且在一个默认形参值的右边不能有未指定默认值的参数。
2、  在调用一个函数时,若果省去了某个实参,则直到最右端的实参都要省去。
3、  默认形参值的说明必须出现在函数调用之前。若函数原型中已给出了形参的默认值,则在函数定义中不得重复制定,即使所指定的默认值完全相同也不行。
4、  在同一个作用域内,一旦定义了默认形参值,就不能在定义它。
5、  如果几个函数说明出现在不同的作用域内,则允许对它们提供不同的默认形参值。
6、  在函数的原型给出了形参的默认值时,形参名可以省略。
第五章
1、相同类型的指针类型才可以想减;两个指针是不可以相加的。
2、一个void类型的地址赋值给非void类型的指针变量,要使用类型强制转换。
3、要初始化多重指针,要从第一层开始,逐步向高层进行。
4、要将字符串q复制给p,除了使用与复制字符数组相同的三种方法外,还可用程序段:
5、new的语法形式:
6、new创建数组的语法格式:
   ※下表表达式与数组初始化时的常量表达式不同,可以是变量表达式。
7、使用new建立多重数组语法格式:
  ※再用new建立多维数组时,只有下标表达式1可以是任意正整数的表达式,而其它下标表达式必须是值为正整数的常量表达式。
8、delete语法格式:
9、delete删除动态数组格式:
   ※[]中不需要说明对象的个数。
   ※对于一个已分配内存的指针,只能用delete释放一次。
10、指针常量定义格式:
11、常量指针定义格式:
12、指针常量:指向的对象不能更改,对象的值能改。
13、常量指针:指向的对象能更改,对象的值不能更改。
14、在定义结构体类型时,只要结构体名不同,那么都是不同的类型,即使它们的成员完全相同。
第六章
1、根据变量定义的位置,变量分为全局变量与局部变量。
2、根据变量的存储方法,变量分为静态变量和动态变量,具体分为4种:自动型(auto)、寄存器型(register)、外部型(extern)和静态型(static)。
   ※使用extern只是将一个已存在的变量、函数声明为extern变量函数,而不是定义变量,所以不能赋初值。
   ※当一个变量被声明为全局静态变量时,不能再被声明为extern变量。
3、c++程序的内存通常被分为4个区:
   (1)全局数据区(全局变量、静态变量、字符串变量和常变量)
   (2)代码区(所有的函数和代码)
   (3)栈区(为运行函数而分配的函数参数、局部变量和返回地址)
   (4)堆区(动态分配内存)
4、宏定义可以嵌套定义、被重复定义,但不能递归定义。
5、定义名字空间的格式如下:
第七章
1.      在类体内不允许对成员函数进行初始化。
2.      定义类时,类的数据成员不占内存空间;但是,建立类的对象时,只为每个对象分配用于保存数据成员的内存,不为函数成员分配内存。
3.      在定义类时,不能定义该类的变量,只能定义该类类型的指针成员和该类类型的引用成员。
4.      浅拷贝和深拷贝的区别:当类的数据成员是指针类型时,深拷贝能为新的对象分配内存空间(分配内存空间一般由new运算符实现;拷贝构造函数就是深拷贝),而浅拷贝不能。
5.      对象指针只能访问该类的公有数据成员和函数成员。
6.      除非是作为函数参数与函数返回值,对象引用在定义时必须要初始化。
7.      非静态函数有一个指向当前对象的this指针,而静态函数没有。静态函数不属于任何类。
8.      在组合类的构造函数中,初始化列表既不能决定是否调用成员对象的构造函数,也不能决定调用构造函数的顺序,成员对象调用顺序由成员对象定义的顺序决定。
9.      静态变量和静态对象都只被构造一次。
10.   类的静态数据成员必须进行初始化,且其初始化语句既不属于任何类,也不属于包括主函数在内的任何函数。
11.   静态变量的初值缺省时为0,;动态变量的缺省初值不确定。
12.   静态成员函数可以直接访问类中说明的静态成员,但不能直接访问类中的非静态成员。
13.   静态数据成员不是对象成员,在引用时不需要用对象名。(?为什么?)
14.   不允许常对象调用任何类的成员函数,而且常对象一旦被定义,在其生存期内不允许改变。
15.   只有类的常成员函数才能访问该类的常对象;const对象不能访问非常成员函数。
16.   常成员函数必须进行初始化,且初始化只能通过构造函数的初始化列表进行。
17.   常成员函数的定义格式:    
18.   常成员函数不能更新类的数据成员。
19.   保护成员具有双重角色,对派生类的成员函数而言,它是共有成员,但对所在类之外定义的其它函数而言则是私有成员。
20.   使用this指针返回对象则不需要调用构造函数,但会调用拷贝构造函数。
21.   先建立全局变量,在建立局部变量。
构造函数的调用条件:
1.      建立对象时;
2.      建立动态对象(如p=new char)时;
※定义对象指针、对象引用时均没有建立对象,所以此时不调用构造函数。
※数组元素为n,定义数组时调用构造函数的次数为n。
※一个对象可以建立多个构造函数,但是只有一个析构函数。
※构造函数没有返回值,也不能用void修饰。
※构造函数被声明定义为公有函数。
拷贝构造函数的调用条件:
1.      当用类的一个对象去初始化该类的另一个对象时;
2.      如果函数的形参是类的对象,调用函数时,将对象作为函数实参传递给函数的形参;
3.      如果函数的返回值是类的对象,函数执行完成,将返回值返回。
4.      使用this指针返回对象。
※拷贝构造函数只能有一个参数,并且是对某个对象的引用。
※建立对象时,构造函数和拷贝构造函数有且仅有一个被调用。
※再重新定义拷贝构造函数后,默认拷贝构造函数与默认构造函数就不存在了;但是,再重新定义构造函数后,默认构造函数就不存在了,但默认拷贝构造函数还存在。
析构函数的调用条件:析构函数在程序结束时由系统自动调用。
组合对象的构造函数的调用顺序:在定义一个组合类的对象时,不仅他自身的构造函数将被调用,而且还将调用其成员函数的构造函数,调用先后顺序为:
1.     成员对象按照在其组合类的声明中出现的次序,依次调用各自的构造函数,而不是按初始化列表中的顺序。
2.      组合类对象调用组合类构造函数。
3.      调用析构函数,析构函数的调用顺序与构造函数正好相反。
构造、拷贝以及析构函数的调用顺序:对象被析构的顺序与其创建的顺序相反。
第八章
1、如果几类定义了带形参表的构造函数时,派生类就应当定义构造函数。如果积累没有定义构造函数,派生类也可以不定义构造函数。
2、派生类的构造函数和析构函数都不能被继承。
3、多继承时,对同一个基类,不允许直接继承两次。
4、最远派生类(c++将建立对象时所使用的派生类称为最远派生类)的构造函数要调用该公共基类的构造函数,而且只能被调用一次。
5、公共虚基类子对象只初始化一次。
6、c++规定,在初始化列表中同时出现对虚基类和非虚基类构造函数的调用,虚基类的构造函数优于非虚基类的构造函数的执行。
类型兼容的三种情况:
1、派生类对象可以赋值给基类对象;
2、派生类对象可以初始化积累的引用;
3、派生类的地址可以赋值给指向基类的指针。
单继承或多继承时,派生类构造函数的调用顺序:
1、调用基类的构造函数;
2、调用内嵌成员对象的构造函数调用顺序按照它们在类中定义的顺序;
3、派生类自己的构造函数。
单继承时,派生类的析构构造函数的调用顺序:
1、调用派生类析构函数;
2、然后调用派生类成员对象析构函数;
3、最后调用基类析构函数。
第九章
1、c++中的运算符除了“1.2.* 3::4?:5 siziof”之外,其余全部可以被重载。
2、对于运算符重载为类的友元函数,VC++6.0不允许在声明重载运算符之前使用using namespace std,多以分别列出对cout和endl的使用:using std::cout;using std::endl;。
3、重载为类的成员函数语法形式为:
4、重载为类的有原函数的定义格式:
             
5、无法声明一个抽象类的对象。
抽象类:
1、  带有纯虚构函数的类被称为抽象类。纯虚构函数的定义形式:
virtual 函数类型 函数名(参数表)=0;
2、  抽象类不能用作参数类型、函数返回值或强制类型转换;
3、  可以定义一个抽象类的指针和引用。通过抽象类的指针和引用,可以指向并访问各派生类成员,这种访问具有多态特征。
成员函数运算符与友元函数运算符的特点:
1、  一般情况下,单目运算符最好重载为类的成员函数;双目运算符最好重载为类的友元函数。
2、  一些双目运算符不能重载为类的友元函数:=、()、[ ]、->。
3、  类型转换函数只能定义为一个类的成员函数而不能定义为类的友元函数。
4、  如果一个运算符的操作需要对象的状态,选择重载为成员函数较好。
5、  若运算符所需的操作数(尤其是第一个操作数)希望有隐式转换,则只能选用友元函数。
6、  当运算符函数是一个成员函数时,最左边的操作数(或者只是最左边的操作数)必须是运算符类的一个类对象(后者是对该类对象的引用)。如果左边的操作数必须是一个不同的对象,或者是一个基本数据类型的对象,该运算符函数必须作为一个友元函数来实现。
7、  当需要重在运算符的运算具有可交换性时,选择重载为友元函数。                                                   
运算符被重载的规则:
1、  重载后运算符的优先级与结合性不会改变。
2、  不能改变原运算符操作数的个数。
3、  不能冲在c++中没有的运算符。
4、  不能改变运算符的原有语义。
类的成员函数的运算符重载规则:
   ① 双目运算符重载为类的成员函数时,函数只显式说明一个参数,该形参是运算符的右操作数。
   ② 前置单目运算符重载为类的成员函数时,不需要显式说明参数,即函数没有形参。
   ③ 后置单目运算符重载为类的成员函数时,为了与前置单目运算符区别,函数要带有一个整型形参。
类的友元函数的运算符重载规则:
1双目运算符 B重载后,表达式oprd1 B oprd2等同于operator B(oprd1,oprd2 );
②前置单目运算符 B重载后,表达式 B oprd等同于operator B(oprd ) ;
③后置单目运算符 ++和--重载后,表达式 oprd B 等同于operator B(oprd,int )
虚函数:
1、  虚函数不能使静态函数,也不能是友元函数。
2、  内联函数是不能在运行中动态确定其位置的,即使虚函数在类的内部定义,编译时,仍将其看做非内联的。
3、  只有类的成员函数才能说明为类的虚函数;虚函数仅适合于有继承关系的类对象。
4、  构造函数不能是虚函数,析构函数可以是虚函数,而且通常声明为虚函数。
※动态联编只能通过指针或引用标志对象来操作函数。如果采用一般类型的标志对象来操作虚函数,则将采用静态联编方式调用虚函数。
第十章
类模板定义语法:
模板类的成员函数在类外定义的语法格式:
类模板实例化、建立对象的语法形式:   
※类模板的类型参数也可以采用默认值。带默认模板参数值的类模板的默认值给出顺序为从右向左,实参值结合顺序为从左向右。
函数模板的定义形式:
           
函数显示实例化的格式:函数名<具体函数名1, 具体函数名2,…,常量表达式>(实参表)                 
函数重载
类型兼容
附录1:c++函数分类表 类别
原型
功能简述
C++头文件
C式头文件
数 学
double sqrt(x)
求x的平方根
cmath
math.h
int abs(x)
求整型数的绝对值
long labs(long n)
求长整型数的绝对值
double fabs(double x)
求浮点数的绝对值
double pow(double x,double y)
x的y次幂
duolbe exp(double x)
e的x次幂
double log(double x)
In x即logex
double log10(double x)
log10x
double sin(double x)
求x的正弦值
double cos(double x)
求x的余弦值
double tan(double x)
求x的正切值
double asin(double x)
求x的反正弦值
double acos(double x)
求x的反余弦值
double atan(double x)
求x的反正切值
double ceil(double x)
求不小于x的最小整数
double floor(double x)
求不大于x的最大整数
字符
int isalpha(int c)
c是否是字母
iostream
ctype.h
int isdigit(int c)
c是否是数字
int tolower(int c)
将c转化成小写字母
int toupper(int c)
将c转化成大写字母
字符串
char *strcpy(char *s1,char *s2)
将字符串s2复制给s1
iostream
string.h
unsigned strlen(char *str)
求字符串str的长度
内存
操作
void *memcpy(void *d,void *s,int c)
将s指向的内存区域的c个字节复制到d指向的区域
iostream
memory.h
类型转换
int atoi(char *s)
将字符串转化成整数
iostream
stdlib.h
char *itoa(int v,char *s,intx)
将整数v按x进制转成字符串s
时间
time_t time(time_t *timer)
返回1970/1/1零点到目前的秒数
ctime
time.h
其他
srand(unsigned seed)
设置随机数的种子,产生0-RAND_MAX的随机数
iostream
stdlib.h
exit(int)
终止正在执行的程序  
 

c知识点篇三:C知识点


一、#include “filename.h”和#include <filename.h>的区别
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件
#include <filename.h>是指编译器将从标准库目录中开始查找此文件
 二、头文件的作用
    加强安全检测
    通过头文件可能方便地调用库功能,而不必关心其实现方式
 三、* , &修饰符的位置
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名
四、if语句
不要将布尔变量与任何值进行比较,那会很容易出错的。
整形变量必须要有类型相同的值进行比较
浮点变量最好少比点,就算要比也要有值进行限制
指针变量要和NULL进行比较,不要和布尔型和整形比较
 五、const和#define的比较
const有数据类型,#define没有数据类型
个别编译器中const可以进行调试,#define不可以进行调试
在类中定义常量有两种方式
1、  在类在声明常量,但不赋值,在构造函数初始化表中进行赋值;
2、  用枚举代替const常量。
 六、C++函数中值的传递方式
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference)
void fun(char  c)  //pass by value
void fun(char  *str)  //pass by pointer
void fun(char &str)  //pass by reference
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构
函数的类型不能省略,就算没有也要加个void
 七、函数体中的指针或引用常量不能被返回
Char *func(void)
{
char str[]=”Hello Word”;
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉
return str;
}
函数体内的指针变量并不会随着函数的消亡而自动释放
 
 八、一个内存拷贝函数的实现体
void  *memcpy(void *pvTo,const void *pvFrom,size_t size)
{
assert((pvTo!=NULL)&&(pvFrom!=NULL));
byte *pbTo=(byte*)pvTo;    //防止地址被改变
byte *pbFrom=(byte*)pvFrom;
while (size-- >0)
  pbTo++ = pbForm++;
return pvTo;
}
 九、内存的分配方式
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题
1、  静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。
2、  栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。
3、  堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。
 
 十、内存分配的注意事项
用new或malloc分配内存时,必须要对此指针赋初值。
用delete 或free释放内存后,必须要将指针指向NULL
       不能修改指向常量的指针数据
 十一、内容复制与比较
//数组……
char a[]=”Hello Word!”;
char b[10];
strcpy(b,a);
if (strcmp(a,b)==0)
{}
//指针……
char a[]=”Hello Word!”;
char *p;
p=new char[strlen(a)+1];
strcpy(p,a);
if (strcmp(p,a)==0)
{}
 
十二、sizeof的问题
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节
char a[]=”Hello World!”
char *p=a;
count<<sizeof(a)<<end;    //12字节
count<<sizeof(p)<<endl;   //4字节
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4
void fun(char  a[1000])
{
count<<sizeof(a)<<endl;  //输出4而不是1000
}
 
十三、关于指针
1、  指针创建时必须被初始化
2、  指针在free 或delete后必须置为NULL
3、  指针的长度都为4字节
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如
char *p=new char[100];
strcpy(p,”Hello World”);
delete []p;   //注意前面的[]号
p=NULL;
5、数组指针的内容不能超过数组指针的最大容易。
如:
char *p=new char[5];
strcpy(p,”Hello World”);  //报错  目标容易不够大
delete []p;   //注意前面的[]号
p=NULL;
 
十四、关于malloc/free 和new /delete
l         malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。
l         注意:malloc/free是库函数,new/delete是运算符
l         malloc/free不能执行构造函数与析构函数,而new/delete可以
l         new/delete不能在C上运行,所以malloc/free不能被淘汰
l         两者都必须要成对使用
l         C++中可以使用_set_new_hander函数来定义内存分配异常的处理
 
十五、C++的特性
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制
重载和内联:即可用于全局函数,也可用于类的成员函数;
Const和Virtual:只可用于类的成员函数;
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。
覆盖是指派生类函数覆盖基类函数
函数名相同;
参数相同;
基类函数必须有Virtual关键字;
不同的范围(派生类和基类)。
隐藏是指派生类屏蔽了基类的同名函数相同
1、  函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。
2、  函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
1、  参数做输入用的指针型参数,加上const可防止被意外改动。
2、  按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如:
将void Func(A a) 改为void Func(const A &a)。
而void func(int a)就没必要改成void func(const int &a);
3、  给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。
4、  Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体;
 
十六、extern“C”有什么作用?
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。
 
十七、构造函数与析构函数
派生类的构造函数应在初始化表里调用基类的构造函数;
派生类和基类的析构函数应加Virtual关键字。
不要小看构造函数和析构函数,其实编起来还是不容易。
#include <iostream.h>
class Base
{
  public:
    virtual ~Base() { cout<< "~Base" << endl ; }
};
class Derived : public Base
{
  public:
    virtual ~Derived() { cout<< "~Derived" << endl ; }
};
void main(void)
{
    Base * pB = new Derived;  // upcast
    delete pB;
}
输出结果为:
       ~Derived
       ~Base
如果析构函数不为虚,那么输出结果为
       ~Base
 
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用
仿止该头文件被重复引用
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=644473

本文来源:https://www.shanpow.com/xhy/482940/

《c知识点.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式

相关阅读
  • [猪八戒网]猪八戒 [猪八戒网]猪八戒
  • 【猪八戒的故事情节】猪八戒的故事 【猪八戒的故事情节】猪八戒的故事
  • 白龙马歌词 白龙马蹄朝西歌词 白龙马歌词 白龙马蹄朝西歌词
  • 哪吒台词 哪吒台词
  • 西游记续编 西游记续编
  • 重生之青牛精 重生之青牛精
  • 蛟魔王 蛟魔王
  • tvb版西游记 tvb版西游记
为您推荐
  • 原著孙悟空干了罗刹女
    原著孙悟空干了罗刹女
    原著孙悟空干了罗刹女篇一:西游记原著中惟一一个与孙悟空缠绵并“做了干夫妻”的妖精是谁?铁扇公主罗刹女铁扇公主罗刹女与孙悟空大力牛魔王与玉面公主《西游记》中的妖怪,不是被悟空、八戒打死,就是被各路神仙收走,唯有一位女妖精,却与大圣半真半假,邂逅缠绵,女妖精“酥胸半露松金钮”,大圣竟然“也与他相倚
  • 游哪里有感450
    游哪里有感450
    游哪里有感450(共6篇)关于游玩的作文450字关于游玩的作文450字 建议去花果山一游 说到吴承恩,就会想到《西游记》,想到齐天大圣孙悟空,也会想到大闹天宫,而我却想到孙悟空的出生地“东海傲来国花果山”。这座山没有
  • 好句摘抄大全
    好句摘抄大全
    好句摘抄大全(共6篇)好句摘抄大全好句大全1 在那翠绿的荷叶丛中,一枝枝亭亭玉立的荷花,像一个个披着轻纱在湖上沐浴的仙光。2 阳光照在波光细细的湖面上,像给水面铺上了一层闪闪发光的碎银,又像被揉皱了的绿缎。3 朝阳下,碧绿
  • 关于读书简笔手抄报
    关于读书简笔手抄报
    关于读书简笔手抄报(共8篇)关于读书的手抄报72651246我爱读书,因为我能在书中找到快乐,读书让我快乐的成长。六、七岁时,我喜欢看《西游记》、《三毛流浪记》等连环画。机智勇猛、本领高强的孙悟空;孤苦伶仃、顽强不屈的三毛,让我
  • 关于西游的续写作文,,650字
    关于西游的续写作文,,650字
    关于西游的续写作文,,650字(共4篇)西游记续写作文西游记续写作文西>游记续写来源:原创 作者:韩雪茹话说猪八戒取得真经后,封了一个净坛使者的称号,八戒想:终于可以安享清福了。从此,他每天都是吃了睡,睡了吃,每次吃过的香蕉皮总是乱扔。一
  • 名著导读试题,《西游记》
    名著导读试题,《西游记》
    名著导读试题,《西游记》(共4篇)中考名著《西游记》阅读练习题(精华版 含答案)中考名著《西游记》阅读练习题(最新整理 精华版 含答案)一、填空题1、《西游记》,长篇 小说,是 中成就最高、最受喜爱的小说,但这部作品并非全无依傍,
  • 关于西游记真假随悟空的故事
    关于西游记真假随悟空的故事
    关于西游记真假随悟空的故事(共7篇)尔雅西游记答案一、 单选题(题数:50,共 50 0 分)1《西游记》的影响和价值是什么?()1 0 分?A、开辟了神魔长篇小说的新门类?B、将善意的嘲笑、辛辣的嘲讽和严肃的批判巧妙结合,影响
  • 南怀瑾讲述《西游记》隐藏的修行真相
    南怀瑾讲述《西游记》隐藏的修行真相
    南怀瑾讲述《西游记》隐藏的修行真相(共3篇)
  • 名著导读钢铁是怎样炼成的题目
    名著导读钢铁是怎样炼成的题目
    名著导读钢铁是怎样炼成的题目(共4篇)《钢铁是怎样炼成的》名著导读练习及答案《钢铁是怎样炼成的》名著导读练习及答案 第一部分:小说相关知识一、作者及时代背景本书成书于1932年一1934年。因作品塑造了保尔·柯察金这个有着钢铁般意志的共产
  • 古咸阳(打西游记人物一)
    古咸阳(打西游记人物一)
    古咸阳(打西游记人物一)(共1篇)