结构体区别
1.定义结构体与C语言一致
2.定义变量可省略关键字struct
3.C++结构体中允许函数存在(C++在没有写构造函数和权限限定的时候,用法和C语言一致)
(1)函数可以直接在结构体中实现,也可在结构体中声明,在结构体外实现,
(2)结构体中函数可以直接访问结构体中数据
(3)学会调用:
? ? ? ? ?对象(结构体变量).成员
? ? ? ? ?对象指针->成员
? ? ? ? ?(*对象指针).成员
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
struct MM
{
//属性,特性 数据成员
char name[20];
int age;
void print()//行为方法 成员函数
{
cout << name << "\t" << age << endl;
}
void printData();//结构体中声明
int& putage()
{
return age;
}
};
void MM::printData()//在结构体外实现
{
cout << name << "\t" << age << endl;
}
//结构体中的变量必须要通过结构体变量(结构体指针)访问
//C++结构体中的函数可以直接访问属性
int main()
{
MM a = {"tatata",21};//等效于struct MM a;
a.print();
(&a)->printData();
MM* p = &a;
p->printData();
p->putage() = 22;
p->printData();
p->age = 23;
p->print();
MM arr[3];
return 0;
}
动态内存申请
1.C语言的动态内存申请
(1)malloc 不带初始化,calloc 带初始化的,realloc 重新申请,free 释放
2.C++的动态内存申请
(1)new 申请,delete 释放
(2)单个动态内存申请
(3)数组动态内存申请
(4)结构体动态内存申请
#include <iostream>
#include <cstring>
using namespace std;
void testonememory()
{
//申请不做初始化
int* pint = new int;
*pint = 123;
cout << *pint << endl;
//申请并做初始化 ()给单个数据初始化
char* pchar = new char('a');
cout << *pchar << endl;
delete pint;
pint = nullptr;
delete pchar;
pchar = nullptr;
}
void testarraymemory()
{
//一维数组不带初始化 长度可以是变量
int* pint = new int[3];//等效产生了int pint[3]数组
char* pchar = new char[20];
//pchar="Iloveyou";只是改变了指针的指向,并没有初始化指针指向的内存段
strcpy(pchar, "Iloveyou");
cout << pchar << endl;
delete[] pint;//数组的释放
pint = nullptr;
delete[] pchar;
pchar = nullptr;
//带初始化的一维数组 用{}
int* pInt = new int[3]{1, 2, 3};
for (int i = 0; i < 3; i++)
{
cout << pInt[i] << " ";
}
cout << endl;
delete[] pInt;//指针再次使用
pInt = nullptr;
}
struct MM
{
char* name;
int age;
void print()
{
cout << name << "\t" << age << endl;
}
};
void teststructmemory()
{
//new 一个对象 结构体初始化只能用{}
MM* pstruct = new MM;
//结构体指针中,要做二次申请,才能进行赋值和strcpy
pstruct->name = new char[20];
strcpy(pstruct->name, "丽丝");
pstruct->age = 21;
pstruct->print();
delete[] pstruct->name;
pstruct->name = nullptr;
delete pstruct;
pstruct = nullptr;
}
int main()
{
testonememory();
testarraymemory();
teststructmemory();
return 0;
}
内存池
1.malloc 内存是在堆区,new内存是自由存储区
#include <iostream>
using namespace std;
void testmemory()
{
char* memorySum = new char[1024];
int* pNum= new(memorySum) int[3]{1, 2, 3};
//char* pstr = new(pNum + 3) char[20]{"Iloveyou"};//等效下面这句话
char* pstr = new(memorySum + 12) char[20];
strcpy(pstr, "Iloveyou");
for (int i = 0; i < 3; i++)
{
cout << pNum[i] << " ";
}
cout << endl << pstr << endl;
delete[] memorySum;
memorySum = nullptr;
}
int main()
{
testmemory();
return 0;
}
string类型
1.string创建
(1)带初始化和不带初始化
(2)通过另一个函数创建
#include <iostream>
#include <string>
using namespace std;
void createstring()
{
std::string str1;//未用using 语法省略
str1 = "Iloveyou";
cout << str1 << endl;
string str2 = "Iloveyou";
cout << str2 << endl;
string str3("Iloveyou");
cout << str3 << endl;
string str4(str3);
cout << str4 << endl;
string str5 = str4;
cout << str5 << endl;
}
2.string基本操作
(1)拷贝
(2)赋值
(3)链接
(4)比较
#include <iostream>
#include <string>
using namespace std;
void operatorString()
{
string str1 = "Ilove";//赋值
string str2 = "You";
string str3 = str2;//拷贝
cout << str3 << endl;
string str4 = str1 + str3;//连接
cout << str4 << endl;
if (str1 > str3)//比较
{
cout << str1 << "大" << endl;
}
else
{
cout << str3 << "大" << endl;
}
}
3.C++string与C语音string.h
(1)C++中是一个自定义类型(类)
(2)C++中的string不能用到C语言的字符串处理函数
(3)C++转换为C语言中的char*:c_str()? ? ?data()? ?
(4)直接把数字转为相应的字符串
#include <iostream>
#include <string>
using namespace std;
#include <cstring>
void compareCandCpp()
{
string str1 = "Iloveyou";
printf("%s\n", str1.c_str());
printf("%s\n", str1.data());
string str2 = to_string(1234);
cout << str2 << endl;
}
注:empty()? ? ? ? ? size()
二位数组的动态内存申请
#include <iostream>
#include <assert.h>
using namespace std;
int** createArray2(int row, int cols);//声明
int main()
{
int** p =createArray2(5, 5);
for (int i = 0; i < 5; i++)//内存检测
{
for (int j = 0; j < 5; j++)
{
p[i][j] = i*j;
cout << p[i][j] << "\t";
}
cout << endl;
}
return 0;
}
int** createArray2(int row, int cols)
{
int** PArray = new int*[row];//二级指针动态申请
assert(PArray);//断言保护
for (int i = 0; i < row; i++)
{
PArray[i] = new int[cols];//一级指针动态申请
assert(PArray[i]);
}
return PArray;
}
|