C++ 第二课作业

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中的内容,未出现报错处理 

还望老师解答一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值