c++零散知识点整理,结构体和类的区别,new和malloc,左值和右值,内存对齐,指针函数指针

C++结构体和类的区别

结构体是一种值类型,而类是引用类型
结构体用栈存储,而类的静态对象使用栈存储,动态用堆
结构体内默认权限是public,类默认为private
结构是无法被继承的,类则可以
如何定义一个只能在堆上(栈上)生成对象的类?

  • 堆上:将析构函数设为私有,类对象就无法建立在栈上了
  • 栈上:将new 和 delete 重载为私有

struct和union

struct和union都包含多个成员,但 union 中起作用的是最后一次存放的成员,每次只能赋一种值, 赋入新值则冲去旧值

  • 共用体的成员互斥,每次只能使用一个
  • 共用体变量所占的内存长度等于最长的成员长度

c++拷贝函数strcpy和memcpy

strcpy只能用于字符串,遇到 ’/0‘ 会停止,
strcpy和memcpy主要有以下3方面的区别。
1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符**"\0"才结束**,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。因此strcpy会复制字符串的结束符“\0”,而memcpy则不会复制。
3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy

c++ volatile关键字

1.表明某个变量的值可能在外部被改变,因此对这些变量的存取不能缓存到寄存器,每次使用时需要到内存重新存取
2.在多线程,多任务或多中断的环境下,变量可能被其他的程序改变,编译器自己无法知道,volatile会使程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据,而不是从寄存器中读取。
3.在linux中,可以使用-O进行优化,volatile可以保证变量不被优化,避免发生错误。
4.volatile变量间的操作,不会被编译器交换顺序

野指针

指针指向了一块随机的空间,不受程序控制。
原因:指针定义时未被初始化,指针被释放时没有置空,操作越界

new和malloc

  • malloc/free是库函数;new/delete是运算符
  • malloc需要指定开辟的空间大小;new不用
  • malloc返回类型为void*,需要转换;new返回对应类型的指针
  • malloc开辟失败会返回NULL;new会抛出异常,返回一个空指针
  • 如果不让new抛出异常的话,可以使用no throw new
  • new会调用构造函数,delete调用析构;malloc不会
  • 用delete可以释放malloc;反之不可以
  • new底层基于malloc实现

C++ final关键字

C++11中允许将类标记为final,方法时直接在类名称后面使用关键字final,如此,意味着继承该类会导致编译错误

网络字节序

大端存储:数据的高位存储在低地址处
小端存储:数据的低位存储在低地址处(类似字符串转整数)

private 有多态吗? 引用有多态吗?

有的

左值和右值

左值:有名字的变量(对象),可以被赋值,可以取地址,可以复用
右值:临时变量(对象),不能被赋值
使用move() 函数可以调用移动构造函数,将某个左值强制转化为右值,相当于一个static_cast;

右值引用的作用:主要是避免了拷贝临时变量时额外的空间占用

main函数执行前、后再执行的代码

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

#include 
using namespace std;
class CTest
{
public:
	CTest(){cout << "构造函数..." << endl;}
	~CTest(){cout << "析构函数..." << endl;}
};
int main()
{
	CTest t;
	return 0;
}

段错误

所谓的段错误 就是指访问的内存超出了系统所给这个程序的内存空间
遇到较多的:数组越界;变量类型不一致;堆栈溢出
解决方案:cout打印关键位置;gdb调试

string与char*的区别

0.char *是一个指针,可以指向一个字符串数组
1.string是一个封装类,char属于基本类型
2.string的内存管理是由系统处理,char *的内存管理由用户自己处理

== 堆的时间复杂度==

初始化建堆 : O(n)
排序重建堆 :O(nlogn)

this指针

是非静态成员函数的隐含形参,可以用来访问类中成员

内存对齐

数据的首地址的值是某个数k(通常它为4或8)的倍数
目的:加快cpu的访问速率,尽可能的从一块内存,一次获取到数据
CPU访问内存数据时会受到地址总线宽度的限制,内存对齐为了让CPU能一次获取到数据,从而提升性能

指针函数和函数指针

指针函数是一个返回指针的函数,其本质是一个函数,而该函数的返回值是一个指针
函数指针是一个指针变量,该指针指向这个函数。总结来说,函数指针就是指向函数的指针
函数指针的函数名带括号,指针函数不带

将一个指针 free 两次之后会发生什么?

  • 当你第一次free之后,就将这块内存归还给系统了,系统有可能马上就将它分配给了其它程序,就会导致其它程序内存被释放
  • 如果赋值为 NULL 不会出现问题,释放空指针是安全的行为。

auto什么时候不能用?

auto 可以自动推理数据类型。
auto不能用来定义数组或函数形参

抽象类和接口类

抽象类:带有纯虚函数的类称为抽象类,可能有其它方法
接口类:如果一个类里面只有纯虚函数,没有其他成员函数和数据成员,就是接口类

你可能感兴趣的:(c++)