面经:C++篇(持续更新)

news/2024/7/20 15:01:38 标签: c/c++, 内存管理

一、 左值和右值

L-value中的L指的是Location,表示可寻址。Avalue (computer science)that has an address.
R-value中的R指的是Read,表示可读。in computer science, a value that does not have an address in a computer language.
左值和右值是相对于赋值表达式而言的。左值是能出现在赋值表达式左边的表达式。左值表达式可以分为可读写的左值和只读左值。右值是可以出现在赋值表达式右边的表达式,他可以是不占据内存空间的临时量或字面量,可以是不具有写入权的空间实体。如
int a=3;
const int b=5;
a=b+2; //a是左值,b+2是右值
b=a+2; //错!b是只读的左值但无写入权,不能出现在赋值符号左边
(a=4)+=28; //a=4是左值表达式,28是右值,+=为赋值操作符
34=a+2; //错!34是字面量不能做左值
 

二、左值引用和右值引用

左值引用

用法:Type & 左值引用名 = 左值表达式;

注意点:声明时必须初始化,初始化之后无法在改变;对别名的一切操作都等价于对原来变量的操作

右值引用:

int &rb = a + 1; 这样的语法,因为a + 1 此时是作为一个右值来使用的,我们无法把一个右值赋值给一个左值引用。左值引用相当于把一个变量的地址付给另一个变量,这两个变量可以访问同一个内存,右值仅仅是一个数,而非内存中的某块地址,因此无法把右值复制给左值引用(这句话并不准确,有的右值也是有地址的,比如字符串常量)。

声明方法:Type && 右值引用名 = 右值表达式;

T&& t在发生自动类型推断的时候,它是未定的引用类型(universal references),如果被一个左值初始化,它就是一个左值;如果它被一个右值初始化,它就是一个右值,它是左值还是右值取决于它的初始化。

三、拷贝构造函数

拷贝构造函数是C++独有的,它是一种特殊的构造函数,用基于同一类的一个对象构造和初始化另一个对象。

当没有重载拷贝构造函数时,通过默认拷贝构造函数来创建一个对象

A a;

A b(a); //调用拷贝构造函数

A b=a;  //调用拷贝构造函数

强调:这里b对象是不存在的,是用a 对象来构造和初始化b的!!

先说下什么时候拷贝构造函数会被调用:

在C++中,3种对象需要复制,此时拷贝构造函数会被调用

1)一个对象以值传递的方式传入函数体

2)一个对象以值传递的方式从函数返回

3)一个对象需要通过另一个对象进行初始化

T function1(){
2     T t(0);
3     return t;
4 }
5 T x=function1();

这里的过程是:
1.创建命名对象t
2.拷贝构造一个无名的临时对象,并返回这个临时对象
3.由临时对象拷贝构造对象x
4.T x=function1();这句语句结束时,析构临时对象
这里一共生成了3个对象,一个命名对象t,一个临时对象作为返回值,一个命名对象x。

四、 模板特化

1.C++模板:

//模板函数
template<typename T, class N> void func(T num1, N num2)
{
    cout << "num1:" << num1 << ", num2:" << num2 <<endl;
}
 
//模板类
template<typename T, class N> class Test_Class
{
    static bool comp(T num1, N num2)
    {
        return (num1<num2)?true:false;
    }
};

2. C++模板全特化

在模板类里,所有的类型都是模板(template<class T>),而一旦我们将所有的模板类型T都明确化,并且写了一个类名与主模板类名相同的类,那么这个类就叫做全特化类。C++模板全特化之后已经失去了Template的属性了。

//模板函数
template<typename T, class N> void func(T num1, N num2)
{
    //cout << "num1:" << num1 << ", num2:" << num2 <<endl;
}
 
//模板类
template<typename T, class N> class Test_Class
{
public:
    static bool comp(T num1, N num2)
    {
        return (num1<num2)?true:false;
    }
};
 
//全特化,模板函数
template<> void func(int num1, double num2)
{
    cout << "num1:" << num1 << ", num2:" << num2 <<endl;
}
 
//全特化,模板类
template<> class Test_Class<int, double>
{
public:
    static bool comp(int num1, double num2)
    {
        return (num1<num2)?true:false;
    }

注意:一个模板被称为全特化的条件:1.必须有一个主模板类  2.模板类型被全部明确化

3. C++模板偏特化

偏特化就是介于二者之间的模板,它的模板名与主版本模板名相同,但是它的模板型中,有被明确化的部分和没有被明确化的部分。

//模板函数
template<typename T, class N> void func(T num1, N num2)
{
    //cout << "num1:" << num1 << ", num2:" << num2 <<endl;
}
 
//模板类
template<typename T, class N> class Test_Class
{
public:
    static bool comp(T num1, N num2)
    {
        return (num1<num2)?true:false;
    }
};
 
//偏特化,模板函数
template<class N> void func(int num1, N num2)
{
    cout << "num1:" << num1 << ", num2:" << num2 <<endl;
}
 
//偏特化,模板类
template<class N> class Test_Class<int, N>
{
public:
    static bool comp(int num1, double num2)
    {
        return (num1<num2)?true:false;
    }

注意:偏特化的条件:1.必须有一个主模板   2.模板类型被部分明确化

4. 模板类调用优先级

全特化类>偏特化类>主版本模板类

模板特化作用:性能优化,针对某一类型特定实现,使模板能够正常工作

 

五、 STL 算法对自定义类型重载=运算符

六、 delete 和 delete[] 区别

 delete和delete[]对基本数据类型没有区别

 但对类对象有区别,delete只调用一次析构函数,而delete[]调用多次析构函数

七、继承

基类不能被继承的:构造函数,析构函数,赋值运算符,友元函数

不能被声明虚函数的:构造函数,new ,delete(因为new和delete是静态成员函数,静态成员函数是不能被声明为virtual的,因为virtual是针对对象,而静态是针对类)

默认生成的:构造函数,析构函数,赋值运算符=,取地址运算符&

6.shared_ptr内部实现原理

7.vector内存进制,插入,删除

8.内存管理方法

 

转载于:https://www.cnblogs.com/dj0325/p/9484098.html


http://www.niftyadmin.cn/n/975633.html

相关文章

Unity3D 物体移动方法总结

1. 简介 在Unity3D中&#xff0c;有多种方式可以改变物体的坐标&#xff0c;实现移动的目的&#xff0c;其本质是每帧修改物体的position。 2. 通过Transform组件移动物体 Transform 组件用于描述物体在空间中的状态&#xff0c;它包括 位置(position)&#xff0c; 旋转(rotati…

Anaconda下载、安装及配置教程

最近因为换了新电脑需要重新安装Anaconda&#xff0c;刚好把这个过程记录下来&#xff0c;方便以后自己再安装的时候参考&#xff0c;顺便也分享给第一次安装的伙伴们。本次安装教程以Win10系统为例 首先安装Anaconda不需要先安装Python了&#xff01; 接下来就进入主题.....…

Python文本数据互相转换(pandas and win32com)

(工作之后&#xff0c;就让自己的身心都去休息吧) 今天介绍一下文本数据的提取和转换&#xff0c;这里主要实例的转换为excel文件&#xff08;.xlsx&#xff09;转换world文件&#xff08;.doc/docx&#xff09;&#xff0c;同时需要使用win32api&#xff0c;同pywin32库。 pan…

Linux强制重启

2019独角兽企业重金招聘Python工程师标准>>> Linux使用shutdown -r now 或者 reboot、init 6 命令无法重启时使用以下两条命令可强制重启&#xff1a; echo 1 > /proc/sys/kernel/sysrq echo b > /proc/sysrq-trigger 1./proc/sys/kernel/sysrq 向 sysrq 文…

全世界最成功的程序员:成功不需要远见卓识

说到如何在科技行业获得名声和财富&#xff0c;人们往往会想到像苹果创始人史蒂夫•乔布斯&#xff08;Steve Jobs&#xff09;那样具有远见卓识的人。 但是&#xff0c;远见卓识并不是让Linux内核发明者林纳斯•托瓦兹&#xff08;Linus Torvalds&#xff09;变成全世界最著名…

DW集成学习Task2

&#xff08;未添加代码块&#xff09; 1. 导论 有监督学习&#xff08;回归、分类&#xff09;和无监督学习&#xff08;聚类&#xff09; 回归&#xff1a;因变量是连续变量 分类&#xff1a;因变量是离散变量 有监督学习&#xff1a;有因变量&#xff0c;有特征向量&#…

Python菜鸟之路:Django 表单验证

前言 Django中完成表单验证&#xff0c;常用的有两种方法&#xff1a; 一种是通过HTML JS Ajax实现。 另一种是通过Django自身的forms模块来生成相应个HTML标签来完成表单验证。这是本节着重讲的地方 第一种方法&#xff1a;html ajax实现基本的login页面 <!DOCTYPE htm…