C++基础

C++基础

引用

引用,是某一变量或对象的别名,对引用的操作与对其所绑定的变量或对象的操作完全等价。

类型 &引用名=目标变量名;

1、&不是求地址运算符,而是起标志作用
2、引用的类型必须和气所绑定的变量的类型相同
3、声明引用的同时必须对其初始化
4、引用相当于变量或对象的别名,因此不能再将已有的引用名作为其他变量或对象的名字或名字
5、引用不是定义一个新的变量或对象,因此内存不会为引用开辟新的空间存储这个引用

#include<iostream>
using namespace std;
int main(){
    int value=10;
    int &new_value=value;
    cout<<"value在内存中的地址为:"<<&value<<endl;
    cout<<"new_value在内存中的地址为:"<<&new_value<<endl;
    return 0;
}

常引用
在上面时候需要使用常引用?
如果既要利用引用提高程序的效率,又要保护传递给函数的数据不再函数中被改变,就应使用常引用。

const 类型 &引用名=目标变量名;

1、常引用不允许通过该引用对其所绑定的变量或对象进行修改

引用与指针有什么区别?

引用必须被初始化,指针不必
引用初始化不能被改变,指针可以改变所指的对象
不存在指向空值的引用,但是存在指向空值的指针

c++有哪些性质

封装、继承、多态
封装:使一部分成员充当类与外部的接口,而将其它的成员隐藏起来,这样就限制了外部对成员的访问,也使不同类之间的相互影响度降低
多态:是对于不同对象接收相同消息时产生不同的动作。
继承:继承是面向对象的一个重要概念,如果一个类B继承自另一个类A,就把这个类B称为“A的子类”,而把A称为“B的父类”。继承可以使得子类具有父类的各种属性和方法,而不需要再次编写相同的代码,在令子类继承父类的同时,可以重新定义某些属性,并重新某些方法,即覆盖父类的原有属性和方法,使其获得与父类不同的功能
  继承是指一个对象直接使用另一个对象的属性和方法,事实上我们遇到的很多事物都有继承的含义,例如,若把动物看做一个实体,他可以分成很多个子实体,如:猫、狗、鸡等等,这些字实体都具有动物的特性,因此,动物是它们的“父亲”,而这些子实体则是动物的“孩子”。

c++的多态

多态:是对于不同对象接收相同消息时产生不同的动作。
简单的理解为:
同一条函数调用语句能调用不同的函数;或者说,对不同对象发送同一消息,使得不同对象有各自不同的行为。
c++的多态具体体现在运行和编译两个方面:
在程序运行时的多态性通过继承和虚函数来体现;
在程序编译时多态性体现在函数重载和运算符重载。
包含虚函数的类称为多态类。

c++是不是类型安全的?

不是,两个不同类型的指针之间可以强制转换(用reinterpret cast)。c#是类型安全的。

c++的main函数执行以前,还会执行什么代码?

全局对象的构造函数会在main函数之前执行。

c++内存的分配方式有几种?

1、从全局/静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量。
2、在栈上创建。在执行函数式,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时,这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
3、从堆上分配,那些由new分配内存,delete释放内存的内存块,他们的释放编译器不取关,由我们的应用程序去控制,如果程序员没有释放掉,那么在程序结束后,操作系统会自动收回。
4、自由存储区,就是那些由malloc分配,free来结束生命的内存块,和堆十分相似。
5、常量存储区。这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。

解释堆和栈的区别

1、管理方式:堆中资源由程序员控制(容易产生memory leak),栈资源由编译器自动管理,无须手动控制。
2、碎片问题:对于堆,频繁的new/delete会造成大量碎片,使程序效率降低。对于栈,它是一个先进后出的队列,进出一一对应,不会产生碎片。
3、生长方向:对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长。
4、分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配,静态分配是编译器完成的,比如局部变量的分配,动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,它的动态分配是由编译器进行释放,无需我们手工实现。
5、分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆由C/C++函数库提供,机制很复杂,所以堆的效率比栈低很多:(例如为了分配一块内存,库函数会按照一定的算法在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。)
6、空间大小:堆不是连续的内存区域(因为系统是用链表来存储空闲内存地址,自然不是连续的)
,堆的大小受限于计算机系统中有效的虚拟内存(32bit系统理论是4G),所以堆的空间比较灵活,比较大。栈是一块连续的内存区域,大小是操作系统预定好的,Windows下栈的大小是2M(也有1M,在编译时确定,VC中可设置)
7、系统响应:栈,只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
堆,首先,操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆节点,然后将该节点从空闲节点链表中删除,并将该节点的空间分配给程序。
对于大多数系统,会在这块内存空间的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。由于找到的堆节点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。

全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的?

生命周期不同:全局变量随主程序创建而创建,随主程序销毁而销毁;局部变量在局部函数内部,甚至局部循环体等内不存在,退出就不存在;
使用方式不同:通过声明后全局变量,程序的各个部分都可以用到;局部变量只能在局部使用
内存分配位置不同:全局变量在静态存储区域分配,局部变量在栈区分配。
操作系统和编译器通过内存分配的位置来知道的:全局变量分配在全局数据段并且在程序开始运行的时候被加载,局部变量则被分配在堆栈里。

c++的虚函数和纯虚函数

为了方便使用多态特性,我们常常需要在基类中定义虚函数。
在类的成员函数定义前加 virtual 关键字,该函数将被作为虚函数。
纯虚函数除了有virtual 关键字外,还令它等于0,以表为纯虚函数。

谈谈类和结构体的区别

结构体在默认情况下的成员都是public的,而类在默认情况下的成员是private。

进程和线程的差别

进程就是一段程序的执行过程
在一个程序中,独立运行的程序片段叫做线程
一个进程process中至少有一个线程thread
多进程:进程不止一个,开销比较大,通信方式比较复杂,维护成本不高
多线程:利用共享内存的方式进行指令的执行,开销比较低,但是维护起来比较麻烦,需要考虑到共享资源的问题,不支持分布式运算。
最简单的比喻多线程就像火车的每一节车厢,而进程则是火车。车厢离开火车是无法跑动的,同理火车也不可能只有一节车厢。多线程的出现就是为了提高效率。

友元关系有什么特性?

在编程中我们通过public,protected和private这些访问级别可以让程序员控制谁有权使用某个类里的某个方法和属性。这个强大的方案可以把代码的实现细节掩藏起来,不让没有相应权限的其它代码访问到。
可是在某些场合,一个完全无关的类由于某些特殊原因需要访问到某个protected成员,甚至某个private成员,这时就需要:友元关系。
友元是C++提供的一种破坏数据隐蔽和封装的机制。
友元函数是在类中使用关键字friend修饰的非成员函数。
单向的,非传递的,不能继承
参考

头文件的作用是什么?

1、通过头文件来调用库功能。在很多场合,源代码不便向用户公布,只要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码
2、头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。
参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值