1、类和对象
1.1封装
1.1.1创建类
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
const double PI = 3.14;
//设计一个圆类
class Circle
{
//访问权限
public:
//属性
int m_r;
//行为
double calculateZC()
{
return 2 * PI * m_r;
}
};
class Student
{
public:
string Name;
int ID;
void StudentShow()
{
cout << "name:" << Name << " ID:" << ID << endl;
}
};
int main()
{
//通过圆类,创建具体的圆(对象)
Circle c1;
c1.m_r = 10;
cout << "圆的周长为:" << c1.calculateZC() << endl;
//
Student s1;
s1.Name = "jay";
s1.ID = 10086;
s1.StudentShow();
system("pause");
return 0;
}
1.1.2成员属性设为私有
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string.h>
using namespace std;
class Person
{
public:
//写姓名
void setName(string name)
{
m_Name = name;
}
//读姓名
string getName()
{
return m_Name;
}
//读年龄
int getAge()
{
return m_Age;
}
void setAge(int age)
{
m_Age = 0;
if (age > 0 && age < 150)
{
m_Age = age;
}
else
{
return;
}
}
//情人、
void steLover(string lover)
{
m_Lover = lover;
}
private:
//可读可写
string m_Name;
//可读
int m_Age;
//可写
string m_Lover;
};
int main()
{
Person p1;
p1.setName("jay");
p1.steLover("昆凌");
p1.setAge(40);
cout << "姓名为:" << p1.getName() << endl;
cout << "年龄为:" << p1.getAge() << endl;
system("pause");
return 0;
}
1.1.3设计类案例
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string.h>
using namespace std;
class Cube
{
//行为
public:
//获取/设置长
void setLong(int l)
{
m_L = l;
}
int getLong()
{
return m_L;
}
//获取/设置宽
void setWidth(int w)
{
m_W = w;
}
int getWidth()
{
return m_W;
}
//获取/设置高
void setHigth(int h)
{
m_H = h;
}
int getHigth()
{
return m_H;
}
//获取面积
int calculateS()
{
return 2 * (m_L * m_W + m_L * m_H + m_W * m_H);
}
//获取体积
int calculateV()
{
return m_L * m_W * m_H;
}
//利用成员函数判断两个立方体是否相同
bool isSamebyClass(Cube& c)
{
if (m_H==c.getHigth()&&m_L==c.getLong()&&m_W==c.getWidth())
{
return true;
}
return false;
}
//属性
private:
int m_L;
int m_W;
int m_H;
};
//利用全局函数判断两个立方体是否相同
bool isSame(Cube &c1,Cube &c2)
{
if (c1.getLong() == c2.getLong() && c1.getWidth() == c2.getWidth() && c1.getHigth() == c2.getHigth())
{
return true;
}
return false;
}
int main()
{
Cube c1;
c1.setLong(10);
c1.setWidth(10);
c1.setHigth(10);
cout << "c1面积=" << c1.calculateS() << endl;
cout << "c1体积=" << c1.calculateV() << endl;
Cube c2;
c2.setLong(10);
c2.setWidth(10);
c2.setHigth(10);
//全局函数
bool ret1 = isSame(c1, c2);
if (ret1)
{
cout << "全局函数:c1,c2 is same!" << endl;
}
else
{
cout << "全局函数:c1,c2 is same!" << endl;
}
//成员函数
bool ret2 = c1.isSamebyClass(c2);
if (ret2)
{
cout << "成员函数:c1,c2 is same!" << endl;
}
else
{
cout << "成员函数:c1,c2 is same!" << endl;
}
system("pause");
return 0;
}
1.2对象的初始化和清理
1.2.1构造函数和析构函数
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string.h>
using namespace std;
class Person
{
public:
//1.构造函数
//无返回值,不用写void;函数名与类名相同
//可以发生重载,创建对象时会自动调用且只调用一次
Person()
{
cout << "Person 构造函数的调用" << endl;
}
//2.析构函数
//无返回值,不用写void;函数名与~类名相同
//不可以发生重载,无参数创建对象时会自动调用且只调用一次
~Person()
{
cout << "Person 析构函数的调用" << endl;
}
private:
};
void test01()
{
Person p1;
}
int main()
{
test01();
system("pause");
return 0;
}
1.2.2深拷贝与浅拷贝
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string.h>
using namespace std;
class Person
{
public:
Person()
{
cout << "Person 构造函数的调用" << endl;
}
Person(int age,int height)
{
m_Age = age;
m_height = new int(height);
cout << "Person 有参构造函数的调用" << endl;
}
Person(const Person& p)
{
cout << "Person 拷贝函数的调用" << endl;
m_Age = p.m_Age;
m_height = new int(*p.m_height);
}
~Person()
{
if (m_height != NULL)
{
delete m_height;
m_height = NULL;
}
cout << "Person 析构函数的调用" << endl;
}
int m_Age;
int* m_height;
private:
};
void test01()
{
Person p1(18,180);
cout << "p1的年龄为:" << p1.m_Age <<"身高为:"<<*p1.m_height<< endl;
Person p2(p1);
cout << "p2的年龄为:" << p2.m_Age << "身高为:" << *p2.m_height << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
1.2.3静态成员变量
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string.h>
using namespace std;
//静态成员变量
class Person
{
public:
//1.所有成员共享一份数据
//2.编译阶段就分配内存
//3.类内声明,类外初始化
static int m_Age;
private:
static int m_height;//类外无法访问
};
int Person::m_Age=20;
int Person::m_height = 180;
void test01()
{
Person p1;
cout << "p1年龄为" << p1.m_Age << endl;
Person p2;
p2.m_Age = 40;
cout << "p1年龄为" << p1.m_Age << endl;
}
//静态成员变量两种访问方式
void test02()
{
//1.通过对象访问
Person p;
cout << p.m_Age << endl;
//2.通过类名访问
cout << Person::m_Age << endl;
}
int main()
{
//test01();
test02();
system("pause");
return 0;
}
1.2.4静态成员函数
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string.h>
using namespace std;
//静态成员函数
class Person
{
public:
//1.所有成员共享一个函数
//2.静态成员函数只能访问静态成员变量
static int m_Age;//静态成员变量
int m_A;//非静态成员变量
static void func()
{
//m_A;无法访问
cout << "static void func()调用:" << "年龄为" << m_Age << " 身高为" << m_height << endl;
}
private:
static int m_height;//类外无法访问
};
int Person::m_Age=20;
int Person::m_height = 180;
//静态成员变量两种访问方式
void test01()
{
//1.通过对象访问
Person p;
p.func();
//2.通过类名访问
Person::func();
}
int main()
{
test01();
system("pause");
return 0;
}
1.3友元
1.3.1全局函数作友元
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string.h>
using namespace std;
class Building
{
//全局函数goodGay()是Building的友元,可以访问私有成员
friend void goodGay(Building* building);
public:
Building()
{
m_BedRoom = "卧室";
m_SittingRoom = "客厅";
}
string m_SittingRoom;
private:
string m_BedRoom;
};
//全局函数
void goodGay(Building *building)
{
cout << "全局函数goodGay()正在访问:" << building->m_SittingRoom << endl;
cout << "全局函数goodGay()正在访问:" << building->m_BedRoom << endl;
}
void test01()
{
Building building;
goodGay(&building);
}
int main()
{
test01();
system("pause");
return 0;
}
1.4运算符重载
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string.h>
using namespace std;
class Person
{
public:
//成员函数重载
/*Person operator+(Person& p)
{
Person temp;
temp.m_A = this->m_A + p.m_A;
temp.m_B = this->m_B + p.m_B;
return temp;
}*/
int m_A;
int m_B;
private:
};
//全局函数重载
Person operator+(Person& p1, Person& p2)
{
Person temp;
temp.m_A = p1.m_A + p2.m_A;
temp.m_B = p1.m_B + p2.m_B;
return temp;
}
void test1()
{
Person p1;
Person p2;
p1.m_A = 10;
p1.m_B = 20;
p2.m_A = 10;
p2.m_B = 20;
Person p3 = operator+(p1, p2);
Person p4 = p1 + p2;
cout << "p3.m_A=" << p3.m_A << endl;
cout << "p4.m_A=" << p4.m_A << endl;
}
int main()
{
test1();
system("pause");
return 0;
}
1.5继承
1.5.1继承方式
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string.h>
using namespace std;
class Base
{
public:
int m_A;
protected:
int m_B;
private:
int m_C;
};
//公共继承
class Son1:public Base
{
public:
void func()
{
m_A = 10;//父类中公共权限的成员,在子类中仍为公共权限
m_B = 10;//父类中保护权限的成员,在子类中仍为保护权限,类外无法访问
//m_C = 10;父类私有权限成员,子类无法访问
}
};
//保护继承
class Son2 :protected Base
{
public:
void func()
{
//保护权限成员,类外无法访问
m_A = 10;//父类中公共权限的成员,在子类中仍为保护权限
m_B = 10;//父类中保护权限的成员,在子类中仍为保护权限
}
};
//私有继承
class Son3 :private Base
{
public:
void func()
{
//私有继承,在子类全部变成私有成员
m_A = 10;
m_B = 10;
}
};
int main()
{
system("pause");
return 0;
}
1.5.2继承中同名成员的处理
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string.h>
using namespace std;
class Base
{
public:
int m_A=200;
void func()
{
cout << "Base下func()的调用" << endl;
}
};
//继承中同名成员的处理
class Son:public Base
{
public:
int m_A = 100;
void func()
{
cout << "Son下func()的调用" << endl;
}
};
void test01()
{
Son s1;
cout << "Base下的m_A=" << s1.Base::m_A << endl;
cout << "Son下的m_A=" << s1.m_A << endl;
s1.Base::func();
s1.func();
}
int main()
{
test01();
system("pause");
return 0;
}
1.5.3 多继承语法
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string.h>
using namespace std;
class Base1
{
public:
int m_A = 100;
};
class Base2
{
public:
int m_A = 200;
};
//多继承语法
class Son :public Base1, public Base2
{
public:
int m_C = 300;
int m_D = 400;
};
void test()
{
Son s1;
cout << "sizeof(s1)=" << sizeof(s1) << endl;
//父类出现同名成员时,需加作用域
cout << "Base1::m_A=" << s1.Base1::m_A << endl;
cout << "Base2::m_A=" << s1.Base2::m_A << endl;
}
int main()
{
test();
system("pause");
return 0;
}
1.6多态
1.6.1动态多态
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string.h>
using namespace std;
class Animals
{
public:
virtual void speak()
{
cout << "动物在说话" << endl;
}
};
class Cat:public Animals
{
public:
void speak()
{
cout << "小猫在说话" << endl;
}
};
void doSpeak(Animals& animal)
{
animal.speak();
}
void test()
{
Cat cat;
doSpeak(cat);
}
int main()
{
test();
system("pause");
return 0;
}
1.6.2多态实现计算器
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string.h>
using namespace std;
class Calculator
{
public:
virtual int getResult()
{
return 0;
}
int m_Num1;
int m_Num2;
};
//加法
class Add:public Calculator
{
public:
int getResult()
{
return m_Num1 + m_Num2;
}
};
//减法
class Sub:public Calculator
{
public:
int getResult()
{
return m_Num1 - m_Num2;
}
};
//乘法
class Mul:public Calculator
{
public:
int getResult()
{
return m_Num1 * m_Num2;
}
};
//除法
class Div :public Calculator
{
public:
int getResult()
{
return m_Num1 / m_Num2;
}
};
void test()
{
//加法
Calculator* p = new Add;
p->m_Num1 = 10;
p->m_Num2 = 10;
cout << p->m_Num1 << " + " << p->m_Num2 << " = " << p->getResult() << endl;
delete p;
//减法
p = new Sub;
p->m_Num1 = 10;
p->m_Num2 = 10;
cout << p->m_Num1 << " - " << p->m_Num2 << " = " << p->getResult() << endl;
delete p;
//乘法
p = new Mul;
p->m_Num1 = 10;
p->m_Num2 = 10;
cout << p->m_Num1 << " * " << p->m_Num2 << " = " << p->getResult() << endl;
delete p;
//除法
p = new Div;
p->m_Num1 = 10;
p->m_Num2 = 10;
cout << p->m_Num1 << " / " << p->m_Num2 << " = " << p->getResult() << endl;
delete p;
}
int main()
{
test();
system("pause");
return 0;
}
1.7函数模板
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
//函数模板
template<typename T>//声明创建模板
void Swap(T& a, T& b)
{
T temp = a;
a = b;
b = temp;
}
void test()
{
int a = 10;
int b = 20;
//1.自动类型推导
Swap(a, b);
cout << " a= " << a << " b= " << b << endl;
//2.显示指定类型
Swap<int>(a, b);
cout << " a= " << a << " b= " << b << endl;
}
int main()
{
test();
system("pause");
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
//函数模板
template<typename T>//声明创建模板
void Swap(T& a, T& b)
{
T temp = a;
a = b;
b = temp;
}
template<typename T>//声明创建模板
void mySort(T arr[], int len)
{
for (int i = 0; i < len; i++)
{
int min = i;
for (int j = i+1; j < len; j++)
{
if (arr[min] > arr[j])
{
min = j;
}
}
if (min != i)
{
Swap(arr[min], arr[i]);
}
}
}
template<typename T>//声明创建模板
void arrPrint(T arr[], int len)
{
for (int i = 0; i < len; i++)
{
cout <<" " << arr[i] << " ";
}
cout << endl;
}
void test01()
{
char arr[] = { "gfdcabe" };
int len = sizeof(arr) / sizeof(arr[0]);
mySort(arr, len);
arrPrint(arr, len);
}
void test02()
{
int arr[] = {0,9,8,7,6,5,4,3,2,1};
int len = sizeof(arr) / sizeof(arr[0]);
mySort(arr, len);
arrPrint(arr, len);
}
int main()
{
test01();
test02();
system("pause");
return 0;
}