C++ 基础知识

语言

**

sizeof 和 strlen的区别

一个函数的形参是数组,在函数内部调用 sizeof 和 strlen 分别得到什么答案
在主函数中对一个指向字符串的指针分别调用sizeof 和 strlen分别得到什么答案**

一、定义不同
sizeof是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组(返回数组大小)、指针(储存指针所用空间大小)、类型、对象、函数等。
strlen是函数,要在运行时才能计算。参数必须是字符型指针。当数组名作为参数传入时,实际上数组就退化成指针了。

int main()
{
    class A
    {
    public:
        char array[100];
        int *p;
        vector<int> darray;
        A()
        {
            p = new int[100];
            cout << "sizeof(class A):" << sizeof(class A) << endl;
            cout << "sizeof(array):" << sizeof(array) << endl;
            cout << "sizeof(vector<int>):" << sizeof(darray) << endl;
            cout << "sizeof(*p):" << sizeof(*p) << endl; // p 为 p[0] 这个元素的首地址
            cout << "sizeof(p):" << sizeof(p) << endl;   //
            test(array);
        }
        void test(char array[]){
            cout << "test:sizeof(array):" << sizeof(array) << endl;//数组退化成指针,因为编译是计算好了
            memset(array,'a',sizeof(char)*100);
            cout<< "array=[aaa...aaa]:"<<strlen(array)<<endl;
            array[2]=0x00;//此位置设置结束符
            cout<< "array=[aa 0x00 ...aaa]:"<<strlen(array)<<endl; 
        }
    };
    class A ca;
    cout << "sizeof(A 对象):" << sizeof(ca) << endl;
}

输出

sizeof(class A):136
sizeof(array):100
sizeof(vector<int>):24
sizeof(*p):4
sizeof(p):8
test:sizeof(array):8
array=[aaa...aaa]:100
array=[aa 0x00 ...aaa]:2
sizeof(A 对象):136

指针和引用的区别

相同点:

引用和指针都是地址的概念,引用是一个内存对象的别名,指针指向一个内存对象,保存了这个对象的内存地址。

区别:

1.引用不能为空,即不存在对空对象的引用,指针可以为空,指向空对象。
2.引用必须初始化,指定对哪个对象的引用,指针不需要。
3.引用初始化后不能改变,指针可以改变所指对象的值。
4.引用访问对象是直接访问,指针访问对象是间接访问。
5.引用的大小是所引用对象的大小,指针的大小,是指针本身大小,通常是4字节。
6.引用没有const,指针有const
7.引用和指针的++自增运算符意义不同。
8.引用不需要分配内存空间,指针需要。

传值和传引用和传指针的区别

值传递本质上就是传递变量。值传递过程中,实参和形参在各自的存储空间有各自不同的变量地址,形参的改变不会影响传递进来的实参值
传递指针本质上也是一种值传递。将指针指向的地址给函数的局部变量形参,函数可以通过*符号或者&符号对这个地址的数据进行操作 。 如下:
```
void f(int *p){
int p1=*p;
int &p2=*p;
}
```

switch 参数有什么限制

switch 后面的表达式不能跟double,float,string ,bool,可以接long,int,short,byte,char
可以将double,float,string 转换成hash,参考constexpr 用法
strcpy 与 memcpy 的区别

1)	复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2)	复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
3)	用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy

什么是野指针、空指针以及区别

	空指针值为0 野指针不为0,指向不能被当前程序访问的地址,
覆盖、重载和重写的区别
覆盖、重写:子类覆盖父类的方法;重载是在类中的方法名相同,但是参数不同。

模板和函数重载的区别

[函数模板和函数重载](https://blog.csdn.net/qq_34606496/article/details/123141817)

函数指针

是指向函数的指针变量,所指向的地址是函数的入口地址,用途,可调用函数,或者作为函数参数

static 关键字的使用

(一)在C语言中static的作用如下

(1)static修饰变量时,修饰的静态局部变量只执行一次,延长局部变量的生命周期,在程序运行结束后才会释放。
(2)static修饰全局变量时,全局变量只能在本文件中访问,不能在其它文件中访问,即便是extern外部声明也不可以。
(3)static修饰函数时,函数的只能在当前文件中调用,不能被其他文件调用。Static修饰的局部变量存放在全局数据区的静态变量区。初始化的时候自动初始化为0。

(二)在C++中static关键字可以用来修饰静态数据成员和静态成员方法

修饰静态数据成员

静态数据成员可以实现多个对象之间的数据共享,它是类的所有对象的共享成员,它在内存中只占一份空间,如果改变它的值,则各对象中这个数据成员的值都被改变。
静态数据成员是在程序开始运行时被分配空间,到程序结束之后才释放,只要类中指定了静态数据成员,即使不定义对象,也会为静态数据成员分配空间
静态数据成员可以被初始化,但是只能在类体外进行初始化,若为对静态数据成员赋初值,则编译器会自动为其初始化为0
静态数据成员既可以通过对象名引用,也可以通过类名引用。

修饰静态成员函数

(1)静态成员函数和静态数据成员一样,他们都属于类的静态成员,而不是对象成员。
(2)非静态成员函数有this指针,而静态成员函数没有this指针。
(3)静态成员函数主要用来方位静态数据成员而不能访问非静态成员。
————————————————
版权声明:本文为CSDN博主「打铁匠中的攻城狮」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wudewen0907/article/details/107574884

类内static 成员可以定义为 const的吗

const修饰符用于表示函数不能修改成员变量的值,该函数必须是含有this指针的类成员函数,函数调用方式为thiscall,而类中的static函数本质上是全局函数,调用规约是__cdecl或__stdcall,不能用const来修饰它. 但是static 的数据成员可以声明为const.

malloc和new区别

new是关键字 malloc是函数
new从自由存储区上分配内存,malloc从堆上分配内存。
自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配。那么自由存储区是否能够是堆(问题等价于new是否能在堆上动态分配内存),这取决于operator new 的实现细节。自由存储区不仅可以是堆,还可以是静态存储区,这都看operator new在哪里为对象分配内存。

new、delete 返回的是某种数据类型指针;malloc、free 返回的是 void 指针。
使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算;使用malloc则需要显式地指出所需内存的尺寸。

new 可以调用对象的构造函数,对应的 delete 调用相应的析构函数;malloc 仅仅分配内存,free 仅仅回收内存,并不执行构造和析构函数。在new一个对象的时候,首先会调用malloc为对象分配内存空间,然后调用对象的构造函数。delete会调用对象的析构函数,然后调用free回收内存。
new、delete 是操作符,可以重载;malloc、free 是函数,可以重写(覆盖)。

什么是智能指针,实现原理

智能指针

如何避免循环依赖

什么是多态

c++之多态性,什么是多态?如何实现?

什么是虚函数

虚函数:即被virtual修饰的类成员函数称为虚函数。

虚函数存放的内容

虚表指针存放的位置

对象中

构造函数可以是虚函数吗

从存储空间角度
虚函数对应一个vtable,可是这个vtable其实是存储在对象的内存空间的。
那么问题来了,如果构造函数是虚函数,就要通过vtable来调用,可是对象空间还没有实例化,也就是内存空间还没有,无法找到vtable,所以构造函数不能是虚函数。

从使用角度
虚函数主要用于在信息不全的情况下,能够使重载的函数得到对应的调用。构造函数本身就是要初始化实例,那使用虚函数也没有实际意义。
另外,虚函数的作用在于通过父类的指针或者引用来调用它的时候能够变成调用子类的那个成员函数,从而实现多态,也就是实现“一个接口,多种方法”。而构造函数是在创建对象时自动调用的,不可能通过父类的指针或者引用去调用,因此规定构造函数不能是虚函数。
https://blog.csdn.net/weixin_40637594/article/details/108755804

虚构函数可以是虚函数吗

可以,防止内存泄漏,同时释放子类和父类指针

extern “c” 的作用

extern "C"的目的就是主要实现C与C++的相互调用问题。

宏定义和内联函数的区别
条件编译
深拷贝和浅拷贝
C++ 内存管理
一个空类编译器会自动生成哪些函数
内存对齐机制
委托构造函数的优缺点

计算机网络

OSI 七层模型
输入 url 到显示界面的过程
三次握手和四次挥手
什么情况下会重传
time_wait 的作用
TCP 和 UDP 的区别
使用 TCP 和 UDP 的协议
如何使用 udp 实现可靠
GET 和 POST的区别
http 和 https 的区别
拥塞控制和流量控制的区别
如何解决粘包问题
NAT 的原理
滑动窗口机制

数据结构

map 的底层实现
vector 和 list 的区别
vector 的扩容原理
红黑树的特点
二叉搜索树、平衡二叉树和红黑树的区别
迭代器失效问题
B 树 和 B+ 树的区别
STL容器的线程安全性

操作系统

进程和线程的区别
进程间通信的方式
进程之间的状态转换
进程上下文切换的细节
线程上下文切换的细节
线程的同步和互斥
什么是守护进程
什么是僵尸进程和孤儿进程
多线程编程注意的地方
虚拟内存的原理
IO 模型
slect、poll、epoll 的区别
边缘触发和水平触发的区别
进程调度算法
生成可执行文件的四个过程
怎么用程序判断一个系统是大端字节序还是小端字节序
死锁产生的必要条件
如何避免死锁

算法

删除链表的结点
合并两个链表
常用的排序算法,哪些是稳定的哪些是不稳定的
快速排序的原理和实现
环形链表
环形链表II
两个栈实现队列
二分查找

作者:陈乐乐
链接:https://leetcode-cn.com/circle/discuss/IdrZuE/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值