C++基础知识点(一)

1:指针()、引用(&)、解引用()、取地址(&)的概念和区别

概念:

指针指向一块内存,指针保存的是内存的地址;
引用是变量的别名,本质是引用该变量的地址。

区别

(1)引用使用无需解引用,指针需解引用。
(2)引用不能为空,指针可以为空。
(3)引用在定义时被初始化一次,之后不可改变;指针指向的值和本身的值是可变的,也就是说,指针只是一块地址,地址里的东西可变。
(4)程序会给指针变量分配内存区域,而引用不需要分配内存区域。

2:memset、memcpy、和strcpy的区别

memcpy是内存拷贝函数,可以拷贝任何数据类型的对象,例如memcpy(b,a,sizeof(b))。

strcpy只能拷贝字符串,遇到’\0’结束拷贝。

memset用来对一段内存空间设置为某个字符,例如:char a[100];memset(a,’ ',sizeof(a)).

3:struct和class的区别,struct与union的区别

struct和class都是生命类的关键字
区别是:
(1)在默认情况下,struct的成员变量是公共(public)的;默认情况下,class的成员变量是私有(private)的/
(2)struct保证成员按照声明顺序在内存中存储,class不能保证。
(3)对于继承来说,class默认是private继承,struct默认是pubic继承。

区别是(union与class同理):
(1)一个union类型的变量,所有成员变量共享一块内存,该内存的大小有这些成员变量中长度最大的一个决定。
struct中成员变量内存是独立的。
(2)union分配的内存是连续的,而struct不能保证分配的内存是连续的。

struct与union的区别:
(1)struct与union都有多个不同的数据类型成员组成,但是,union的成员共享存储空间一块内存地址,而struct成员不是。
(2)因此,对于union的一个成员赋值,那么其他成员会重写,而struct则不会。

4:指针在16位机、32位机、64位机分别占用多少字节

16位机:2字节 32位机:4字节 64位机:8字节。

5:如何引用一个已经定义过的全局变量?区别是什么

如果在同一个文件中,直接引用即可。
如果不在同一个文件中,有俩种方式:
(1)直接引用头文件就可以使用。
(2)用extern关键字重新声明一下。

6:全局变量可不可以定义在可被多个.C文件包含的头文件中?

因为全局变量的作用域是整个源程序,可以声明多次,但是只能定义一次,变量的声明一般放在头文件中,在实际编程中一般很少在头文件中定义全局变量,因为多次引可能重定义。

7:对于一个频繁使用的短小的函数,在C\C++中分别怎么实现?

C用宏定义
C++用inline

8:main函数执行以前会执行什么代码?

全局对象的构造函数会在main函数之前执行,比如int a,初始化位0。

9:局部变量能否和全局变量重名?

可以,但是局部变量会屏蔽全局变量。要用全局变量,需要使用域作用符“::”。

10:内存的分配方式以及它们的区别:

1.在一个C/C++程序中,程序对内存的分配分为代码区,全局区(静态区),堆区,栈区;地址是依次增大的。
2.从静态存储区域分配。该存储区在程序编译的时候已经分配好了,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
3.在栈上创建。在执行函数时,函数的局部变量存储在该区域,函数结束时会释放该存储空间。栈分配运算内置于处理器的指令集。
4.从堆上分配,亦称为动态内存分配。 程序在运行时用malloc和new申请任意多少的内存,程序员自己负责在何时使用free和delete释放内存。动态内存的生存期由程序员决定,使用非常灵活。
5.在代码区,存放的是程序的函数体的二进制代码;

11:类的成员函数重载、覆盖和隐藏的概念与区别:

概念:
重载是指在同一个作用域内,有几个同名的函数,但是参数列表的个数和类型不同。
函数覆盖是指派生类函数覆盖基类函数,函数名、参数类型、返回值类型一摸一样。派生类的对象会调用子类的覆盖版本,覆盖父类中的函数版本。
“隐藏”是指派生类的函数屏蔽了与其同名的基类函数。

覆盖与重载的区别:
函数是否处在不同的的作用域,参数列表是否一样;基类函数是否含有virtual关键字。

隐藏和覆盖的区别:
1.派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被覆盖。
2.派生类的函数与基类的函数同名,参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏有virtual,就是覆盖。

如果子类覆盖父类的函数但是不加virtual,也能实现多态,由于virtual修饰符会被隐形继承,但是尽量加上。

12:static关键字

为什么引入static:
编译器为局部变量在栈上分配内存,但是函数执行结束时释放掉。所以static可以解决函数执行完成后变量值释放的问题,static变量存储在静态储存区。

缺点:
不安全,因为作用域是全局的。
优点:
因为静态变量对所有对象所共有,可以节省内存,提高效率。

静态数据成员的使用方式:
<类名>::<静态成员名>
作用:
1.可以用于全局变量的定义:为该变量分配静态存储区。程序结束前不会被释放。
2.声明和定义静态成员函数:表示该函数为静态函数,只能在本文件中被调用。
3.定义静态局部变量:只能被定义一次,只有程序运行结束才会释放。区别是作用域的范围。

13.const与#define的概念和优缺点

const用来定义常量、修饰函数参数、修饰函数返回指,可以避免被修改,提高程序的健壮性。
define是宏定义,在编译时会进行替换,这样做的话可以避免没有意义的数字和字符串,便于程序阅读

区别:
1.const定义的数据有数据类型,而宏常量没有数据类型。编译器可以对const常量进行类型检查。而宏定义只进行字符替换,没有类型安全检查,所以字符替换时可能出错。

	列子:
			写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。
			#define MIN(A,B)<= (B)(A) : (B)
			least = MIN(a,b);
			下面的关键字const时什么含义
			const int a; 		//a是一个常整型数
			int const a;		//a是一个常整型数
			const int *a;		//a是一个指向常整型数的指针
			int *const a;		//a是一个指向整型数的常指针
			int const *a const;	//a是一个指向常整型数的常指针

static关键字的作用:
1.函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时维持上次的值。
2.在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其他函数访问。
3.在模块内的static函数只可被一模块内的其他函数调用,这个函数的使用范围被限制在声明它的模块内。
4.在类中的static成员变量数与整个类所拥有,对类的对象只有一份拷贝。
5.在类中的static成员函数属于整个类所拥有,这个函数不接受this指针,因而只能访问类的static成员变量。

const关键字作用
1.欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后没有机会去改变它了;
2.对指针来说,可以定义指针本身为const,也可以指定指针所指的数据为const,或二者同时为const;
3.在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;
4.对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量;
5.对于类的成员函数,有时候必须指定其返回指为const类型,以使得其返回指不为“左值”。

14:堆栈溢出的原因

没有回收垃圾资源

栈溢出:
一般都是由越界访问导致的。例如局部变量数组越界访问或者函数内局部变量使用过多,超出了操作系统为该进程分配的栈的大小。

堆溢出:
由于堆是用户申请的,所以溢出的原因可能是程序员申请了资源但忘记释放了。

15:刷新缓冲区的方式

换行刷新缓冲区:printf("\n")、endl;
程序结束刷新缓冲区: return 0;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>