C++知识点总结(持续更新)

1.结构体:
1)概念:一个或多个 同类型或者不同类型的数据 的数据的集合
2)字节对齐: 8字节对齐
3)与类的区别:
结构上: 类中有构造函数和析构函数,类的成员变量默认为private
结构体中没有构造函数和析构函数,结构体的所有成员默认为public
存储: 类是 引用类型抽象的, 使用堆存储
结构体是 实值类型具体的, 使用栈存储
功能: 两者都可以声明构造函数,但结构体中 构造函数不能带参,类中无限制;
结构体不能声明析构函数,类无限制
结构体无法被继承,类可以被继承
结构体无法使用new ,类可以使用new初始化
4)如何选择结构还是类:   
a.  堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些
b.   结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低。
c.  在表现抽象和多级别的对象层次时,类是最好的选择
d.  大多数情况下该类型只是一些数据时,结构时最佳的选择 
5)与C结构体区别:
C++中结构体可以有成员变量 也可以有函数,C中结构体不能有函数只能有数据类型 的数据
6)不定长结构体: 即 结构体中含有指针
struct Node {
int a;
char * b;
};
2.引用

 1)概念:  用来 给 变量起外号
 2) 何处使用  :
  类型标识符 &引用名  =  引用对象;
  example  :     
      int a = 10;
      int &b = a;

3)与指针的区别:
a. 引用是给对象起别名,并没有额外占用内存,初始化时不能为空。指针占用了额外的内存空间(32位下4字节,64位下8字节);
指针指向某块内存,所以初始化的时候可以不用指向任何对象,但初始化的时候必须进行判空,但引用不需要;
b. 引用 其指向的内存地址不能改变,但内容可以改变
指针 指向的内存地址可以改变, 内容也可以改变
4)优缺点:
优点: 节省空间,尤其是在传输数据量过大的时候,效率高,节省空间
缺点: 引用一旦绑定了变量后,就不能改变内存地址
5) 左值和 右值引用
int a = 10;
//左值:有确定的内存地址和内容,可以被赋值和多次使用
int &b = a;
//右值 :没有名字的临时变量,不能被赋值,只能在一条语句中出现,如: 临时变量
int &&c = 10;

3.Const
1)作用:
关键字 ,表示不能被修改的意思
2)不同位置的用法
//const 修饰变量
int a = 10;
const int * a = &b;
int const * a = &b;
//const 在* 左边时,表示a的内存地址可以修改,但是内容不能被修改
int * const a = &b;
//const 在*右边时,表示a的内存地址不能被修改,但是内容可以修改
const int * const a = &b;
//*左右两边都有const时,表示a的内存地址,内容 都不能被修改
//const修饰函数
const int getvalue() const
//const 在函数头表示 返回值不能修改; const在函数尾 表示函数尾可读函数,成员不能被修改
{
int a = 10;
return a;
}
3) const与define的区别
作用方式:#define 只是单纯的字符替换,不进行数据检查;
const 会进行数据检查
作用地点:#define 作用于预编译阶段;
const 作用于程序的编译和运行阶段
存储方式: #define 有若干个备份,存储在栈区
const 只有一个备份,存储在堆区
#define 不可调试,const可进行调试

4.指针

  1. 概念:
    本质: 指针就是地址,地址就是指针
    2)一般指针:
    即 变量的内存地址 = 指针
    int a = 10;
    int * p = &a;

3)函数指针
即 将函数的地址用指针来存储
适用场景: 函数回调
#include “stdafx.h”
#include
using namespace std;
void test()
{
cout << “Hello world” << endl;
}

int main()
{
//函数指针赋值, 最终两个都能输出 Hello World
void(*p)() = test;
p();
void(*p1)() = &test;
p1();
return 0;
}

4) 智能指针
概念:
是指RII智能指针是RAII(Resource Acquisition Is Initialization,资源获取即初始化)机制对普通指针进行一次封装。 使得智能指针行为像是一个指针,但本质是一个对象。
C++代码实现:
// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//

#include “stdafx.h”
#include
#include
#include
using namespace std;

class Test
{
public:
Test()
{
count++;
cout << “Test()” << endl;
}
Test(const Test&t)
{

	count++;
	cout << "Test()" << endl;
}
~Test()
{
	cout << "~Test()" << endl;
}

int use_count() 
{
	return count;
}
void output() 
{
	cout << "~Test()" << endl;
}

private:
int count = 0;
};

template
class AutoPtr
{
public:
AutoPtr()
{

}

AutoPtr(T * ptr) 
{
	this->ptr = ptr;
}
AutoPtr(const AutoPtr& ap)
{

	this->ptr = ap->ptr;
} 
~AutoPtr() 
{
	if (ptr != nullptr)
	{
		delete ptr;
	}
}
AutoPtr& operator = (const AutoPtr& ap)
{
	ptr = ap;
}
T& operator* () 
{
	return *ptr;
}

T* get() {
	return ptr;
}
T* operator->() {
	return ptr;
}

private:
AutoPtr(co

  • 12
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值