面向对象
前言
C++里面有句经典台词:
女朋友是new出来的,儿子是继承过来的
这期介绍C++面向对象的知识点,带你面向对象,今天是情人节,不用担心没对象,new一个,有了对象就会累(类),所以我还会介绍类
面向对象三个步奏:定义对象,创建对象,使用对象
本期知识简单地定义了一个女朋友类,然后创建girl对象,最后使用对象introduce
最后祝大家情人节快乐~
目录
new和delete申请释放内存分配多个内存动态分配内存类和对象访问类型限定符类和结构体区别封装定义一个女朋友类string类头文件使用字符串对象 string类创建对象
在学习C++的过程中,有一套区别于C的内存分配,这个就是new和delete这两个关键字
#include<iostream>
using namespace std;
int main()
{
//申请内存
int *p1 = (int *)malloc(sizeof(int));
*p1 = 1;
int *p2 = new int;
//int *p2 = new int(2); //分配内存的同时初始化
*p2 = 2;
cout << *p1 << " " << *p2 << endl;
//释放内存
free(p1);
delete p2;
return 0;
}
#include<iostream>
using namespace std;
int main()
{
int *p3 = new int[3]; //分配多个内存
//int *p3 = new int[3]{ 1,2,3 }; //分配内存的同时初始化
for (int i = 0; i < 3; ++i)
{
p3[i] = i;
cout << p3[i] << ' ';
}
cout << endl;
delete[] p3; //释放内存
return 0;
}
注意:
#include<iostream>
using namespace std;
//数组指针作为函数返回值 列为固定值的受限动态内存分配
int(*create(int row))[3]
{
int(*p)[3] = new int[row][3];
return p;
}
int main()
{
//受限制的动态内存分配
int(*p4)[3] = create(4);
int index = 1;
for (int i = 0; i < 4; ++i)
{
for (int j = 0; j < 3; j++)
{
p4[i][j] = index++;
cout << p4[i][j]<<" ";
}
}
cout << endl;
delete[] p4;
return 0;
}
什么是对象:万物皆对象,拥有相同属性和行为的一组对象 有了对象之后就会累(类),那什么类:类是现实世界对象的抽象,对象是类虚拟世界的实例
简单表示就是:类是一种用户自定义的数据类型,包括表示属性的成员变量和表示行为的成员函数
说到面向对象就不得不提面向对象的三大特性:
封装、继承 和 多态
类的关键字是:class
在对class描述之前需要了解到一个规则:访问控制权限
既然有访问控制权限,那就有访问类型限定符
谁都可以访问(使用/调用)
只有自己和子类可以访问
只有自己(类内部)可以访问
在C++中,类和结构没有本质区别,唯一不同在于
类的默认访问控制属性为private
结构的默认访问控制属性为public
对不同成员的控制访问属性加以区分,体现了C++作为面向对象语言的封装特性
接下来就是类的介绍了,今天是情人节,所以我们定义一个女朋友类
class GirlFrend
{
//属性 成员变量
char m_name[20];
int m_age;
int m_height;
char m_job[20];
public:
//行为 成员函数
void Introduce();
void Sleep();
void Eat();
void SetInformation(char* name, int age, int height, char* job);
};
作为类,我们需要有属性和行为,也就是成员变量和成员函数
在这里是类内声明,类外定义
void GirlFrend::Introduce()
{
cout << "你好!我叫" << m_name << "我今年" << m_age << "岁,身高" << m_height << ",我的职业是" << m_job << endl;
}
void GirlFrend::Sleep()
{
cout << "睡觉觉~" << endl;
}
void GirlFrend::Eat()
{
cout << "吃饭饭~" << endl;
}
void GirlFrend::SetInformation(char* name, int age, int height, char* job)
{
strcpy(m_name, name);
m_age = age;
m_height = height;
strcpy(m_job, job);
}
然后呢在主函数里面创建你的女朋友对象,并初始化你的女朋友
int main()
{
//栈区对象
GirlFrend girl;
girl.SetInformation("女朋友", 18, 165, "白衣天使");
girl.Introduce();
girl.Sleep();
girl.Eat();
//堆区对象
GirlFrend* myGirl = new GirlFrend;
myGirl->SetInformation("女朋友", 18, 160, "白衣天使");
myGirl->Introduce();
myGirl->Sleep();
myGirl->Eat();
return 0;
}
运行结果:
你好!我叫女朋友我今年18岁,身高165,我的职业是白衣天使
睡觉觉~
吃饭饭~
你好!我叫女朋友我今年18岁,身高160,我的职业是白衣天使
睡觉觉~
吃饭饭~
在行为里面有一个函数用来设置对象,为什么不直接赋值,而要定义这样一个函数来初始化对象。
因为class这个关键字的默认访问控制属性为private,意味着只有这个类自己和子类可以访问m_name,m_age这些变量,这个就体现了C++作为面向对象语言的封装特性,我有这个东西,可如果不是我和我儿子,谁都别想访问,就是这么霸道
C++在对字符串的操作上提供了string类
在C里面我们是如何使用字符串的呢
//使用字符数组
char str[] = "hello";
//使用字符指针
char* s = (char*)"world";
//直接使用字符常量
printf("hello world\n");
在C++里面是这样使用字符串的
#include<string> //注意不是string.h
#include<iostream>
#include <string>
using namespace std; //string在命名空间 std 里面
int main()
{
//创建string类对象
string s1 = "123";
string s2("abc");
string* s3 = new string("xyz");
//赋值
s1 = s2; //相比C strcpy 更方便
//比较
if (s1 == s2)
{
cout << "s1 = s2" << endl;
}
//拼接
s1 = s1 + "456";
s1.append("789");
s1.push_back('!');
cout << s1 << endl;
//交换
s1.swap(s2);
cout << s1 << " " << s2 << endl;
//字符串长度
cout << s2.size() << endl;
//查找 替换
cout << s2.find("456", 0) << endl;
s2.replace(s2.find("456", 0), //第 n 个位置开始替换
3, //替换的字符数量
"888"); //替换的字符串
cout << s2;
return 0;
}
运行结果
s1 = s2
abc456789!
abc abc456789!
10
3
abc888789!
对于string类的使用还有很多,最好的学习string类的方法就是自己去实现string类,当然,这比较繁琐,但是非常锻炼基础知识,实现string类需要用到后面的知识,这里就简单地介绍下string类
编辑:梦凡