2020.10.28 第2课 C++与C的区别
一、结构体的基本区别
#include <iostream>
#include <string.h>
using namespace std;
struct MM 定义方式一样
{
char name[20];
int age;
};
int main()
{
MM myMM = { "小仙女",18 }; 类型不需要struct关键字,用到类型的时候直接结构体名字即可
cout << myMM.name << "\t" << myMM.age << endl; 访问 还是 .
MM* p = new MM;
strcpy(p->name, "小可爱"); 指针指向
p->age = 19;
cout << p->name << "\t" << p->age << endl;
return 0;
}
深入区别
#include <iostream>
#include <string>
using namespace std;
//结构体-->类:多个事物的个体的共同属性的抽象
//类: 属性:描述特征(数据类型描述) 行为/方法(操作:成员函数)
//对象: 类的具体化/实例化
struct MM
{
//属性: 数据成员
string name;
int age;
//行为/方法 成员函数
void print() 每一个对象对自己做的事情
{
cout << name << ":" << age << endl;
sleep();
shopping();
}
void sleep(); //睡觉
void shopping() //购物
{
//默认为内联函数
cout << "花钱操作" << endl;
}
};
//在结构体外面如何实现
void MM::sleep() 类的前缀 作用域分辨符
{
cout << "助眠动作" << endl;
}
int main()
{
//成员函数的调用和数据成员是一样的 C++里面函数也可以是数据的一部分
MM sr = { "诗染",38 };
//cout << sr.name << ":" << sr.age << endl;
//sr.shopping();
//sr.sleep();
sr.print(); 打印行为
cout << endl;
MM* pMM = new MM; new出来的对象,指向一段内存,并没有初始化,一段乱码,两个不用的对象是单一的个体,互不影响
//cout << pMM->name << ":" << pMM->age << endl;
//pMM->shopping();
//pMM->sleep(); 不同的对象共同的行为
pMM->print();
cout << endl;
return 0;
}
·
二、string类型的基本用法
#include <string> //C++string头文件
#include <cstring> //C语言头文件
#include <iostream>
/*
1.string不是char *
2.如何使用string
*/
using namespace std;
int main()
{
//1.集中常用的创建过程 直接在后面括号 等于 常量或变量
string str("ILoveyou");
cout << str << endl;
string str2 = "IMissyou";
cout << str2 << endl;
string str3(str2);
cout << str3 << endl;
string str4 = str3;
cout << str4 << endl;
//2.和C语言的区别
printf("%s\n", str4); //string不是char *
//c_str();
printf("%s\n", str4.c_str());
//3.常规运算:
string str5 = str2 + str4;
cout << str5 << endl;
//> < != ==
if (str5 > str2)
{
cout << "max:" << str5 << endl;
}
else
{
cout << "Max:" << str2 << endl;
}
return 0;
}
三、结构体中一些类的思想
#include <iostream>
#include <string>
using namespace std; 深入区别
//结构体-->类:多个事物的个体的共同属性的抽象
//类: 属性:描述特征(数据类型描述) 行为/方法(操作:成员函数)
//对象: 类的具体化/实例化
struct MM
{
//属性: 数据成员
string name;
int age;
//行为/方法 成员函数
void print() 每一个对象对自己做的事情
{
cout << name << ":" << age << endl;
sleep();
shopping();
}
void sleep(); //睡觉
void shopping() //购物
{
//默认为内联函数
cout << "花钱操作" << endl;
}
};
//在结构体外面如何实现
void MM::sleep() 类的前缀 作用域分辨符
{
cout << "助眠动作" << endl;
}
int main()
{
//成员函数的调用和数据成员是一样的 C++里面函数也可以是数据的一部分
MM sr = { "诗染",38 };
//cout << sr.name << ":" << sr.age << endl;
//sr.shopping();
//sr.sleep();
sr.print(); 打印行为
cout << endl;
MM* pMM = new MM; new出来的对象,指向一段内存,并没有初始化,一段乱码,两个不用的对象是单一的个体,互不影响
//cout << pMM->name << ":" << pMM->age << endl;
//pMM->shopping();
//pMM->sleep(); 不同的对象共同的行为
pMM->print();
cout << endl;
return 0;
}
四、结构体构造对象的而过程
三种初始化数据的方式
#include <iostream>
#include <string>
using namespace std;
//构造对象的而过程--->创建结构体变量的过程
//C++中可以删除默认的函数 delete 关键字
struct MM
{
//MM()=delete; //删除默认的构造函数
string name;
int age;
//如何通过成员给数据初始化
//1.传参
void initData(string sName, int sAge)
{
name = sName;
age = sAge;
}
//2.返回引用
string& getName()
{
return name;
}
int& getAge()
{
return age;
}
void print()
{
cout << name << ":" << age << endl;
}
};
//权限区别 C++中的类除了权限之外都可以当作结构体使用
/*
结构体构造函数:
1.名字和结构体名字相同
2.没有返回值
3.不需要自己调用,创建对象的收调用
4.构造函数用来构建对象,对象形态必须和构造函数一致
5.不写构造函数,存在一个默认的构造函数(默认的构造函数没有参数)
6.写了构造函数,默认的就不存在
*/
struct Girl
{
string name;
int age;
//写了构造函数,默认的就不存在,所以不能构造无参对象
Girl(string sName, int sAge)
{
name = sName;
age = sAge;
cout << "调用构造函数" << endl;
}
//函数重载
Girl()
{
cout << "调用无参构造函数" << endl;
}
void print()
{
cout << name << "\t" << age << endl;
}
};
int main()
{
//没有区别
//5.不写构造函数,存在一个默认的构造函数(默认的构造函数没有参数)
MM mm = { "mm1",18 }; //调用默认的构造函数
MM array[3]; //调用默认的构造函数
MM* pMM = new MM; //调用默认的构造函数
//1.第一种 成员函数方式
MM myMM;
myMM.initData("莫非", 18);
myMM.print();
//2.第二种成员函数方式
MM* pM = new MM;
pM->getName() = "夜舞";
pM->getAge() = 16;
pM->print();
//3.创建的对象参数必须要和构造函数一致
Girl mygirl("小可爱",18);
cout << mygirl.name << "\t" << mygirl.age << endl;
Girl boy;
return 0;
}
五、new一个对象的过程
#include <iostream>
#include <string>
/*
构建对象中new一个对象理解
*/
using namespace std;
struct MM
{
string name;
int age;
MM()
{
cout << "一般写个,可以便于构造数组" << endl;
}
MM(string sName,int sAge)
{
name = sName;
age = sAge;
cout << "有参构造函数" << endl;
}
void print();
};
void MM::print()
{
cout << name << ":" << age << endl;
}
int main()
{
//数组:多个普通的变量
//error C2512: “MM”: 没有合适的默认构造函数可用
MM array[3]; //array[0] array[1] array[2]
/*
构造对象中new一个对象理解!!!
1.创建对象指针不调用构造函数
过程:
1.创建一个无名对象 MM 无名对象("MM",18)
2.把无名对象首地址赋值给这个指针
*/
MM* pMM = nullptr;
pMM = new MM; //调用无参的构造函数
pMM = new MM("MM", 18); //调用有参的构造函数
//MM 对象名("MM", 18); 上面没有名字
//pMM = new MM("MM"); 构建无名的对象de形态也要与构造函数一致
MM* pM = new MM("mm1", 19);
pM->print();
return 0;
}
六、感受面向对象编程的思想
感受面向对象的链表 new一个对象 对象做什么
#include <iostream>
#include <string>
using namespace std;
/*
写链表为例:流程基本差不多
*/
struct Node
{
int data;
Node* next;
Node(int data); //构造函数
Node(int data, Node* next); //
};
//负责把用户的数据变成节点
Node::Node(int sData)
{
data = sData;
next = nullptr;
}
//负责创建节点
Node::Node(int sData, Node* sNext)
{
//这个节点的数据是多少
data = sData;
//这个节点的指针是多少
next = sNext;
}
//C++面向对象编程:把链表的属性抽象
struct List
{
Node* headNode; //结构体指针
int listSize;
List() //链表最初形态
{
headNode = nullptr; //开始为空
listSize = 0; //size为0
}
void insertByHead(int data) //不再需要指定链表,就是这个链表
{
headNode = new Node(data, headNode); //new一个对象,调用构造函数的过程
//new一个对象:首先创建一个无名对象
//Node newNode(data,headNode); //他的next指针给headNode
//把当前节点的首地址赋值给指针
listSize++;
}
void print()
{
Node* pMove = headNode;
while (pMove != NULL)
{
cout << pMove->data << "\t";
pMove = pMove->next;
}
cout << endl;
}
};
int main()
{
List* pList = new List; //面向对象的过程 第一步 创建对象(调用构造函数)
pList->insertByHead(1);
pList->insertByHead(2);
pList->insertByHead(3);
pList->print();
return 0;
}
七、第1课作业
#include <iostream>
using namespace std;
void myMalloc(int**& p, int row, int cols)
{
p = new int* [row];
for (int i = 0; i < row; i++)
{
p[i] = new int[cols];
}
}
void myFree(int**& p, int row)
{
for (int i = 0; i < row; i++)
{
delete[] p[i];
}
delete[] p;
p = nullptr;
}
int main()
{
int** array = nullptr;
myMalloc(array,3,3);
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
array[i][j] = i + j;
cout << array[i][j] << "\t";
}
cout << endl;
}
myFree(array, 3);
return 0;
}