一:结构体的区别
#include
#include
using namespace std;
//类
struct MM{
//属性,特征(数据成员)
char name[20];
int age;
//行为,方法(成员函数)
void print(){
cout << name << "t" << age << endl;
}
void printData();//在结构体中声明,在外面实现
//通过外部函数修改数据
int& getAge(){
return age;
}
};
//在结构体外实现:用类名限定::
void MM::printData(){
cout << name << "t" << age << endl;
}
int main(){
//结构体中的函数,可以直接访问数据
struct MM girl = { "小芳", 28 };
MM mm = { "小丽", 24 }; //C++中不用写关键字struct
//学会调用,与C语言访问数据成员的方式一样
girl.print(); //访问方式1:对象(结构体变量).成员
(&mm)-> printData(); //访问方式2:对象指针->成员
//访问方式3:C中指针变量的写法
MM* p = &mm;
p->printData();
//通过外部函数修改数据
p->getAge() = 30;
p->printData();
p->age= 38;
p->printData();
//结构体数组
MM arrat[3];
while (1);
return 0;
}
二:动态内存申请的区别
#include
#include
using namespace std;
#if 0
//单个变量的动态内存申请
void oneMemory(){
//不带初始化的申请
int*pInt = new int;
*pInt = 123;
cout << *pInt << endl;
char* pChar = new char;
*pChar = 'A';
cout << *pChar << endl;
//带初始化的申请:加()给单个数据初始化
int* pNum = new int(134);
cout << *pNum << endl;
//释放
delete pInt;
pInt = nullptr;
delete pChar;
pChar = nullptr;
delete pNum;
pNum = nullptr;
}
//数组的动态内存申请
void ArrayMemory(){
//不带初始化
int* pInt = new int[3];//等效产生了int pInt[3]的数组
char* pstr = new char[15];
strcpy_s(pstr, 15, "ILoveyou");
cout << pstr << endl;
delete[]pstr;
pstr = nullptr;
#if 0//bug
const char* pstr1 = new char[15];
pstr1 = "ILoveyou";//这样写的话"ILoveyou"并没有在所申请的内存中,而是以常量的形式在常量区
cout << pstr1 << endl;
delete[]pstr1;
pstr1 = nullptr;
#endif
//带初始化的 一堆数据用{}-->vs2013不能用{}初始化char
#if 0
int*pNum = new int[3]{ 1, 2, 3 };
for (int i = 0; i < 3; i++){
cout << pNum[i] << " ";
}
cout << endl;
delete[] pNum;
pNum = nullptr;
char* str = new char[20];//vs2013不支持char{ 'A', 'B', ' ' };
cout << str << endl;
delete[]str;
str = nullptr;
str = new char[20];//{ "ILoveyou" };
cout << str << endl;
delete[]str;
str = nullptr;
delete[] pInt;
pInt = nullptr;
#endif
}
#endif // 0
// 结构体的动态内存申请
struct MM{
char*name;
int age;
void printMM(){
cout << name << "t" << age << endl;
}
};
void structMemory(){
int* p = new int(23);
//同上面一样的申请方式
MM* pMM = new MM;
//结构体中指针要做二次申请,才能strcpy,或者赋值
pMM->name = new char[20];
strcpy_s(pMM->name, 20, "丽丝");
pMM->age = 15;
pMM->printMM();
delete[]pMM->name;
delete pMM;
}
int main(){
//oneMemory();
//ArrayMemory();
structMemory();
while (1);
return 0;
}
三:内存池
#include
using namespace std;
//允许申请一段大内存,共给程序使用,综合管理内存
//malloc内存是在堆区
//new内存中在自由存储区
void testMwmory(){
char* Sum = new char[1024];
//下面所需要的内存都源于申请的1024字节
//vs2013不支持用{}初始化char
int*pNum = new(Sum) int[3]{1,2,3};
//new(申请内存的开始位置)...
char*pstr = new(Sum + 12)char[20]; //char[20]{"ILoveuou"}
for (int i = 0; i < 3; i++){
cout << pNum[i] << " "; //pNum等同于(int*)Sum
}
cout << endl << pstr << endl; //pstr等同于(Sum+12)
delete[]Sum; //只用释放一次
Sum = nullptr;
}
int main(){
testMwmory();
while (1);
return 0;
}
四:string类型
#include //注意不是
#include
#include //同C语言的
#include
using namespace std;
//string创建
void creatString(){
//不带初始化
string str1;
str1 = "ILvoeyou";
cout << str1 << endl;
//const修饰后不能修改
const string cstr;
//cstr = "IMissyou";//报错,常属性不能修改
//带初始化:=或者()
string str2("Iloveyou");
cout << str2 << endl;
string str3 = "IMissyou";
cout << str3 << endl;
//通过另一个字符串创建
string str4(str3);
cout << str4 << endl;
string str5 = str4;
cout << str5 << endl;
}
//string的基本操作
void operatorString(){
//赋值:直接赋值 =
string str1 = "A";
string str2 = "600";
string str3 = str2;
cout << str3 << endl;
//连接:用 + 连接,没有减法
string str4 = str1 + str2;
cout << str4 << endl;
//比较:> < != == 直接比较即可
if (str1 > str2){
cout << "大:" << str1 << endl;
}
else{
cout << "大:" << str2 << endl;
}
}
//C++中string 与 C语言的string.h
void CppAndC(){
//string在C++中是一个自定义类型(类),暂当结构体
//string在C++中不能用C语言的字符串处理函数
//那如何转换为C语言的char*呢? 用c_str() 或 data() 函数
string str1 = "ILoveyou";
printf("%sn", str1.c_str());
printf("%sn", str1.data());
//to_string:直接把数字转换为相应的字符串
string str2 = to_string(1234);
cout << str2 << endl;
}
void exOperator(){
//采用下标法打印string
string str = "IMissyou";
for (int i = 0; i < 8; i++){//c++中string没有记录
cout << str[i];
}
cout << endl;
//其他函数操作
//成金油函数:empty() size()
string mystring = "IMissyou";
cout << mystring.size() << endl;
string strEmpty;
if (strEmpty.empty()){
cout << "空" << endl;
}
//做了自动扩增处理
char*str9 = new char[15];
}
int main(){
creatString();
operatorString();
CppAndC();
exOperator();
while(1);
return 0;
}
五:作业:二维数组的动态内存申请与释放
#include
#include
using namespace std;
//二维数组的动态内存申请
int**Arr2D(int row, int cols){
int** pArr = new int*[row];
if (pArr == nullptr)
return nullptr;
for (int i = 0; i < row; i++){
pArr[i] = new int[cols];
}
return pArr;
delete [] pArr;
pArr = nullptr;
}
int main(){
//5行3列
int** p = Arr2D(5, 3);
for (int i = 0; i < 5; i++){
for(int j = 0; j < 3; j++){
p[i][j] = i*j;
cout << p[i][j] << "t";
}
cout << endl;
}
while(1);
return 0;
}