文章目录
C++面向对象编程思想
C 面向过程 从上往下执行 你有多少我执行多少 过程化 模块化 一个功能就是就是一个函数
基本数据类型 char short int long longlong float double
C++新增加了 bool 类型
1、bool型变量:
a)大小与char类型相同;
b)只接受2个数值:true(1)和false(0)
c)别的数值提示截断,除了赋值0其他的值都是true(1)
d)匹配六种关系运算符号以及3种逻辑运算符号(&& || !)
结构体 自定义数据类型
struct SPerson //定义一个人
{
//成员 不加默认共有的
string sName;
bool sex;
int age;
int height;
float weight;
private:
float money;
//自我介绍
public:
void Say()
{
cout<<"姓名:”<<sName<<"性别"<<sex<<"年龄"<<age<<"身高"<<height<<"体重"<<weight<<endl;
}
//吃饭
void eat()
{
cout<<"吃的山珍海味”<<endl;
}
};
C++面向对象
C++ 既可以面向对象也可面向过程编程 面向每一个对象 对象中又分为属性和方法
类和对象
对象:一切皆对象 对象的具体 对象就是类的具体化
类:具有相同属性的集合 范围比较广 类是对象的抽象
面向对象的特点 封装、继承、多态、抽象
C++结构体就是类 C++里面结构体也可以定义函数
类具有成员属性和成员方法
结构体成员:
成员属性:(成员变量) 属性是固有的特性
成员方法:(成员方法) 能力
C++为了专门表示类 用class来定义
使用struct 来定义类和class来定义类是有区别的
1.使用struct 来定义类 所有的成员默认都是公有的(public)除非显式声明为私有的
所有的对象都是公有的 成员的访问权限不一样
2.为了和C语言当中的struct做区别
如果使用class来定义 默认都是私有的(private)除非显式声明为其他类型
3.凡有成员函数C++推荐使用class关键字;
没有成员函数的是纯数据的结构体,还是沿用struct关键字。
4.class工程管理:
成员函数在类外编写,通过定义域::
类的里面不管共有的还是私有的 都可以访问
成员访问限定符:
public 共有的
private 私有的
protected 受保护的
C++构造函数 (专门进行初始化)不传参数的叫做默认构造函数 构造函数可以进行重载(多个参数 一个参数)看你传的是那个参数就调用那个构造函数
1.函数名要与类型名相同
2.没有返回值类型,没有返回值
3.不需要手动调用 ,定义好对象之后第一个调用的就是构造函数
析构函数 与我的构造函数相反, 主要是内存清理和回收
1.函数名 ~类型名
2. 没有返回值,没有参数
3.不需要手动调用(对象被销毁的时候,调用 )
示例代码:
class SPerson1 //定义一个人
{
public:
//成员
char* sName;
char* sex;
int age;
int height;
float weight;
private:
float money;
public:
//设置信息
void SetSInfo()
{
cout << "请输入姓名:" << endl;
cin >> sName;
cout << "请输入性别:" << endl;
cin >> sex;
cout << "请输入年龄:" << endl;
cin >> age;
cout << "请输入身高:" << endl;
cin >> height;
cout << "请输入体重:" << endl;
cin >> weight;
}
/*void SetSInfo2(string n, string s, int a, int h, int w)
{
sName = n;
sex = s;
age = a;
height = h;
weight = w;
}*/
SPerson1() //构造函数 不传参数的叫默认构造函数
{
sName = new char[10]; //动态开辟的内存 要释放内存 就在析构函数里面来清理 这样内存就不会泄露
sex = new char[10];
strcpy_s(sName, sizeof(sName),"张三");
strcpy_s(sex, sizeof(sex),"男");
age = 30;
height = 123;
weight = 100;
}
SPerson1(string n) //重载一个参数构造函数
{
sName = new char[10]; //动态开辟的内存 要释放内存 就在析构函数里面来清理 这样内存就不会泄露
sex = new char[10];
strcpy_s(sName, sizeof(sName),n.c_str()); //string转化c语言 c_str()
strcpy_s(sex, sizeof(sex), "男");
age = 30;
height = 123;
weight = 100;
}
SPerson1(string n, string s, int a, int h, int w) //全部参数重载
{
sName = new char[10]; //动态开辟的内存 要释放内存 就在析构函数里面来清理 这样内存就不会泄露
sex = new char[10];
strcpy_s(sName, sizeof(sName), n.c_str()); //string转化c语言 c_str()
strcpy_s(sex, sizeof(sex), s.c_str());
age = a;
height = h;
weight = w;
}
//析构函数
~SPerson1()
{ //空的话什么都不干
//打印一句话
cout << sName<<"被析构了" << endl;
delete[] sName;
delete[] sex;
}
//自我介绍
void Say()
{
cout << "姓名: " << sName << " 性别 " << sex << " 年龄 " << age << " 身高 " << height << " 体重 " << weight << endl;
}
//吃饭
void eat()
{
cout << " 吃的山珍海味 " << endl;
}
};
int main()
{
/*SPerson p1 = { "马云","男",50 ,196 ,76 };
p1.Say();
p1.eat();
SPerson p2 = { "马化腾","男",32 ,166 ,66 };
p2.Say();
p2.eat();*/
/*SPerson p1 = { "马云","男",50 ,196 ,76 };
p1.Say();
p1.eat();
SPerson p2 = { "马化腾","男",32 ,166 ,66 };
p2.Say();
p2.eat();*/
SPerson1 p3; //调用默认构造函数
//p3.SetSInfo();
//p3.Say();
// p3.SetSInfo2("张三","男",23,167,65);
p3.Say(); //离开main函数后 就会发生析构
SPerson1 p4("李四", "女", 12, 32, 12);//调用重载的构造函数
p4.Say();
//p3 ,p4是局部变量存在于栈中 先进后出
return 0;
}