1.引用是一个常指针
const int a =100; const int &b = a; //相当于 const int* const b =a;
// int tmp = a;因为a是一个常量,需要创建一个临时的变量来存放值,再通过临时的变量给引用赋值。这样做是因为防止以后如果有 int* p=(int)&b,来改变了常量a的值。但是如果a不是常量则没有创建临时变量。
// const int &b = a;
2.const &a = 10.2; const a相当于const int a;
a=????
解释:a的值是10,因为在c++默认的情况下,编译器会把当成int型来处理。
3.全局变量:
(1)初始化全局变量
(2)未初始化全局变量,默认为零
(3)常量区
(4)静态区
4.在代码中出现的比如10、29、3等int型的数字,都是字面常量,没有地址
5.在函数的调用上,fun(const &a),参数中的const有两个作用:
(1)防止通过a来改变a引用的值
(2)使a的引用能力增强了。比如:它可以引用const类型的,也可以引用非const类型的!因为不加const的话,只能引用非const类型的数据.!!!
注意这种引用的方式效率低,因为在函数用到a是会解引用,这样会增加程序运行的次数。如果可以就直接用传值的方式来调用函数。!!
6.引用指针的时候:
int * p=NULL;
int& a=p;
7.关于编译器解释函数原型:
比如函数 int fun(int a, int b);
函数的原型就是:int+fun+int,int
c语言:_fun
c++语言:?+fun(函数名字)+@@YA(调用方式)+H(返回值的类型)+H(第一个参数)+H(第二个参数)+@z(...)
注意:不能用返回值来区分重载函数是因为二义性,函数表中的函数原型是不一样的,但是因为执行时因为二义性不知道要执行那个函数,而无法实现重载,所以不能用返回值来区分函数的重载。
8.extern"c"
{
//code;
}:用c语言方式编译。
extern"c++"
{
//code;
}:用c++语言方式编译。
extern"c++":
9.什么叫早起绑定,什么叫晚绑定。
10.对于内存的分配有三种方式,但是他们有各自存在的理由:
(1)int *p = (int *)malloc(sizeof(int));
(2)int *p = new int(10);
(3)int *r = (int*)::operator new(sizeof(int))->分配一个int大小的空内存。用来完成new不能为自定义类型(比如类)分配空内存缺陷。
operator delete(r)->释放内存
new(r) int(10)->对开辟的空间进行赋值
区别:
(1)的分配方式没有初始值,如果分配失败则返回NULL,用free()来释放内存
(2)的分配方式如果分配失败,则返回异常bad_malloc。用delete来释放内存
(3)的分配方式弥补了(2)再分配自定义类型上的不足,如果new来分配一个自定义类型的累的话代码new Test[maxsize]分配的是一个放有maxsize个Test实例对象的数组,编译器会调用maxsize次Test的构造函数来创建maxsize个对象,而我们要的是一个空内存不需要带有对象的内存。new关键字只是适合分配内置类型的空内存,对于自定义类型(比如类)有时则不可以达到预期效果。
注意:malloc()分配的内置类型的空间可以进行操作
class text
{
int value;
print()
{
cout<<"abc"<<endl;
}
printf()
{
cout<<value<<endl;
}
}
text *p=NULL;
p->print();//不报错,这是因为函数运行起来text类的this指针接受p的NULL,虽然为空但是打印abc的时候,编译器没有把this指针加在"abc"的前面,不会访问空指针,所以不会报错。
p->printf();//报错,这是因为类会在要访问的value前加一个this指针,当要打印value的值的时候,需要访问this指针,但是this接受了函数printf()的this指针的值(来源于p),所以,访问了空指针,所以会报错。
11.虚函数会有一个虚表指针来实现多态。虚表在类对象赋值是不能赋值。
12.编译器对类的编译步骤是什么?
const int a =100; const int &b = a; //相当于 const int* const b =a;
// int tmp = a;因为a是一个常量,需要创建一个临时的变量来存放值,再通过临时的变量给引用赋值。这样做是因为防止以后如果有 int* p=(int)&b,来改变了常量a的值。但是如果a不是常量则没有创建临时变量。
// const int &b = a;
2.const &a = 10.2; const a相当于const int a;
a=????
解释:a的值是10,因为在c++默认的情况下,编译器会把当成int型来处理。
3.全局变量:
(1)初始化全局变量
(2)未初始化全局变量,默认为零
(3)常量区
(4)静态区
4.在代码中出现的比如10、29、3等int型的数字,都是字面常量,没有地址
5.在函数的调用上,fun(const &a),参数中的const有两个作用:
(1)防止通过a来改变a引用的值
(2)使a的引用能力增强了。比如:它可以引用const类型的,也可以引用非const类型的!因为不加const的话,只能引用非const类型的数据.!!!
注意这种引用的方式效率低,因为在函数用到a是会解引用,这样会增加程序运行的次数。如果可以就直接用传值的方式来调用函数。!!
6.引用指针的时候:
int * p=NULL;
int& a=p;
7.关于编译器解释函数原型:
比如函数 int fun(int a, int b);
函数的原型就是:int+fun+int,int
c语言:_fun
c++语言:?+fun(函数名字)+@@YA(调用方式)+H(返回值的类型)+H(第一个参数)+H(第二个参数)+@z(...)
注意:不能用返回值来区分重载函数是因为二义性,函数表中的函数原型是不一样的,但是因为执行时因为二义性不知道要执行那个函数,而无法实现重载,所以不能用返回值来区分函数的重载。
8.extern"c"
{
//code;
}:用c语言方式编译。
extern"c++"
{
//code;
}:用c++语言方式编译。
extern"c++":
9.什么叫早起绑定,什么叫晚绑定。
10.对于内存的分配有三种方式,但是他们有各自存在的理由:
(1)int *p = (int *)malloc(sizeof(int));
(2)int *p = new int(10);
(3)int *r = (int*)::operator new(sizeof(int))->分配一个int大小的空内存。用来完成new不能为自定义类型(比如类)分配空内存缺陷。
operator delete(r)->释放内存
new(r) int(10)->对开辟的空间进行赋值
区别:
(1)的分配方式没有初始值,如果分配失败则返回NULL,用free()来释放内存
(2)的分配方式如果分配失败,则返回异常bad_malloc。用delete来释放内存
(3)的分配方式弥补了(2)再分配自定义类型上的不足,如果new来分配一个自定义类型的累的话代码new Test[maxsize]分配的是一个放有maxsize个Test实例对象的数组,编译器会调用maxsize次Test的构造函数来创建maxsize个对象,而我们要的是一个空内存不需要带有对象的内存。new关键字只是适合分配内置类型的空内存,对于自定义类型(比如类)有时则不可以达到预期效果。
注意:malloc()分配的内置类型的空间可以进行操作
class text
{
int value;
print()
{
cout<<"abc"<<endl;
}
printf()
{
cout<<value<<endl;
}
}
text *p=NULL;
p->print();//不报错,这是因为函数运行起来text类的this指针接受p的NULL,虽然为空但是打印abc的时候,编译器没有把this指针加在"abc"的前面,不会访问空指针,所以不会报错。
p->printf();//报错,这是因为类会在要访问的value前加一个this指针,当要打印value的值的时候,需要访问this指针,但是this接受了函数printf()的this指针的值(来源于p),所以,访问了空指针,所以会报错。
11.虚函数会有一个虚表指针来实现多态。虚表在类对象赋值是不能赋值。
12.编译器对类的编译步骤是什么?