1.C++结构体
1.1C++结构体中是允许函数的存在 ,该函数体可以在结构体内定义,也可以在结构体外定义
#include<iostream>
using namespace std;
struct fox
{//数据成员,属性,特征
int age;
char name[20];
//函数成员,方法
void printdata()
{
cout<<name<<"\t"<<age<<endl;
}
void printData();//函数的声明
};
//外部定义
void fox::printData()
{
cout<<name<<"\t"<<endl;
}
//这种方式要加结构体名限定,告诉别人这个函数来自哪里
1.2
结构体的数据访问必须通过结构体变量(结构体指针)进行访问
C++结构体中的函数访问属性,可以直接访问
#include<iostream>
using namespace std;
struct fox
{//数据成员,属性,特征
int age;
char name[20];
//函数成员,方法
void print()
{
cout << name << "\t" <<age<< endl;
}
void printData();//函数的声明
};
//外部定义
void fox::printData()
{
cout << name << "\t" << endl;
}
//这种方式要加结构体名限定,告诉别人这个函数来自哪
int main()
{
struct fox foxone = { 18,"狐狸" };
foxone.print();//这个就是直接访问 它可以直接访问foxone 这个结构体里面的数据
struct fox* p = &foxone;
p->printData();//通过结构体指针去操作
p->age = 3;
p->print();
}
1.3 在C++中struct 声明了类型之后,定义结构体变量的时候 可以省略关键字struct
所以上面的代码 可以去掉strcut 如下图所示
int main()
{
fox foxone = { 18,"狐狸" };
foxone.print();//这个就是直接访问 它可以直接访问foxone 这个结构体里面的数据
fox* p = &foxone;
p->printData();//通过结构体指针去操作
p->age = 3;
p->print();
}
2.动态内存的申请与释放
和C语言的动态内存概念基本没有差距,无非关键字变成了new,释放变成delete
语法是 new 要申请的类型 [大小];
int main()
{
char str2[20] = "Iloveyou";
char* str = new char[20];//申请char 20字节
strcpy_s(str,20,str2);
cout << str << endl;
}
释放也是一样的
int main()
{
char str2[20] = "Iloveyou";
char* str = new char[20];
strcpy_s(str,20,str2);
cout << str << endl;
//delete str;上下两种写法效果是一样的
delete[]str;
str = nullptr;
}
delete 和delete [ ] 效果是等效的,只是为了增加代码的可读写,有方括号,代表释放是连续的一段内存段
记住一点 申请之后 释放顺序是反过来的
2.1 内存池 (顾名思义我申请一段大内存,我需要的的时候从这个内存池中分配出来)
在C语言里面malloc 申请是堆区内存,C++ new是自由存储区
int main()
{
char* memorySum = new char[1024];//我申请一个很大的内存
double* pnum = new(memorySum) double[3];//我从memorySum申请double数据*3,我可以区使用它了
pnum[1] = 1.0;
pnum[0] = 0.0;
pnum[2] = 2.0;//正常使用
cout << pnum[0] <<"\t"<< pnum[1] <<"\t"<< pnum[2] << endl;
char* name = new(memorySum + 24) char[9];//中间加号看不懂,建议了解指针的偏移
strcpy_s(name,9,"ILOVEyou");
cout << name << endl;//我提前申请了一个大的内存,在需要进行分配
//因为共用一段内存 ,释放头部就好了
delete[]memorySum;
memorySum = nullptr;
}
3.string 类型
C++string 包含头头文件是<string> //注意不是C语言的<string.h>
string 基本操作 拷贝 赋值 链接 比较
string 创建,初始化,不带初始化,字符串创建;
#include<string>
#include<iostream>
using namespace std;
int main()
{
string str;//创建不带初始化
string str1 = "Iloveyou";//带初始化
string str2 = str1;//字符串创建
str = str2; //赋值操作;
//str基本操作 // 拷贝+赋值+ 连接+ 比较
if (str==str2) //str可以直接比较 链接 赋值
{
cout << "相等" << endl;
}
str = str1 + str2;//连接
cout << str << endl;
//最重要的点是
//str类型字符串中没有记录\0的位置,不要越界访问
string str4 = "12345";//按照C语言中 这里的长度算上\0标记应该为下标0~5 也就是长度为6
//但是str没有记录\0 要注意不要超出下标越界访问
cout << str4 << endl;
}
有一个问题:
str4下标【5】里面是应该有一个\0吗? 我多次打印下标5中的内容,未出现报错处理
还望老师解答一下