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.指针
- 概念:
本质: 指针就是地址,地址就是指针
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