简单定义类
#include <iostream> #include <string>
using namespace std;
class Student { public: int uid; char *name; int age;
public: void set(int id, char *name, int age) { this->uid = id; this->name = name; this->age = age; } void display() { cout << this->uid << this->name << this->age << endl; } };
void Call(const Student &ptr) { cout << ptr.name << endl; }
int main(int argc, char *argv[]) { Student stu;
stu.set(1001, "lyshark", 23); cout << stu.uid << stu.name << stu.age << endl; stu.display();
Student *ptr = &stu; cout << ptr->uid << ptr->name << ptr->age << endl;
Call(stu); system("pause"); return 0; }
|
构造/析构 函数: 构造函数与类名相同,没有返回值,不写void,可以发生重载,可以有参数
#include <iostream> #include <string>
using namespace std;
class Student { public: int uid; char *name; int age;
public: Student(int uid,char *name,int age) { this->uid = uid; this->name = name; this->age = age; } ~Student() { cout << "执行结束,析构 !" << endl; } void Display() { cout << this->name << endl; }
};
int main(int argc, char *argv[]) { class Student *stu_ptr[3];
Student stu1(1001, "admin", 22); Student stu2(1002, "guest", 33); Student stu3(1003, "tudyit", 25);
stu_ptr[0] = &stu1; stu_ptr[1] = &stu2; stu_ptr[2] = &stu3;
for (int x = 0; x < 3; x++) stu_ptr[x]->Display();
system("pause"); return 0; }
|
析构函数,没有返回值,不可以写参数,不能发生重载,多用于最后的类的清理左右。
无参数构造函数(默认构造函数),有参数
拷贝构造函数:
#include <iostream> #include <string>
using namespace std;
class Student { public: int uid; char *name; int age;
public: Student(int uid,char *name,int age) { this->uid = uid; this->name = name; this->age = age; } Student(const Student& ptr) { name = ptr.name; cout << "kaobei" << endl; } };
int main(int argc, char *argv[]) { Student stu1(1001, "admin", 22); Student stu2(stu1); cout << stu2.name << endl;
Student stu3 = Student(stu1); cout << stu3.name << endl;
system("pause"); return 0; }
|
浅拷被: 容易崩溃,系统简单的传值,出现问题。
#include <iostream> #include <string>
using namespace std;
class Student { public: char * m_name; int m_age;
public: Student() {
} Student(char * name, int age) { m_name = (char *)malloc(strlen(name) + 1); strcpy(m_name, name); } ~Student() { if (m_name != NULL) free(m_name); }
};
int main(int argc, char *argv[]) { Student stu1("lyshark",25); Student stu2(stu1);
system("pause"); return 0; }
|
深拷贝: 自己开辟堆空间,然后自己在拷贝构造函数中拷贝数据,防止冲突,同样的代码不会出现问题了。
#include <iostream> #include <string>
using namespace std;
class Student { public: char * m_name; int m_age;
public: Student() {
} Student(char * name, int age) { m_name = (char *)malloc(strlen(name) + 1); strcpy(m_name, name); } ~Student() { if (m_name != NULL) free(m_name); } Student(const Student &ptr) { m_age = ptr.m_age; m_name = (char *)malloc(strlen(ptr.m_name) + 1); strcpy(m_name, ptr.m_name); } };
int main(int argc, char *argv[]) { Student stu1("lyshark",25); Student stu2(stu1);
system("pause"); return 0; }
|
多个对象的构造和析构:初始化列表
#include <iostream> #include <string>
using namespace std;
class Student { public: char * m_name; int m_age;
public: Student(char * x, int y) :m_name(x), m_age(y){} };
int main(int argc, char *argv[]) { Student stu("lyshark",23); cout << stu.m_name << stu.m_age << endl;
system("pause"); return 0; }
|
explicit 关键字的作用 该关键字为了防止隐世类型转换,就是防止你瞎搞。
#include <iostream> #include <string>
using namespace std;
class MyString { public: char * m_Str;
public: MyString(const char *str) {
} explicit MyString(int num) {
}
};
int main(int argc, char *argv[]) { MyString str = "lyshark";
system("pause"); return 0; }
|
new 动态对象创建: 忘记 malloc() /free 吧,new 可以自动分配初始化空间,非常方便。开辟空间到堆。
#include <iostream> #include <string>
using namespace std;
class Student { public: char * m_Str;
public: Student() { cout << "默认构造调用" << endl; } ~Student() { cout << "默认析构调用" << endl; } };
int main(int argc, char *argv[]) {
Student *stu2 = new Student; delete stu2;
Student *pArray = new Student[10];
pArray[0].m_Str = "lyshark";
cout << pArray[0].m_Str << endl;
delete [] pArray;
system("pause"); return 0; }
|
静态成员变量: static声明就是静态成员变量,无论建立多少对象,都只有一个静态数据的拷贝,所有对象都共享这个静态数据。
#include <iostream>
using namespace std;
class Student { public: static int m_number; };
int Student::m_number = 100;
int main(int argc, char *argv[]) { Student stu1, stu2; stu1.m_number = 200;
cout << stu1.m_number << endl; cout << stu2.m_number << endl; cout << "通过类名直接访问:"<< Student::m_number << endl;
system("pause"); return 0; }
|
静态成员函数:
#include <iostream>
using namespace std;
class Student { public: static void Display() { cout << "hello lyshark" << endl; } };
int main(int argc, char *argv[]) { Student stu1,stu2;
stu1.Display(); stu2.Display();
system("pause"); return 0; }
|
单例模式设计思想: 一个类中,是能实例化出一个对象,这样就可以防止冲突的情况发生。
想想,如何实现,不论new多少次,始终只能保证,创建一个对象,不多创建。
#include <iostream>
using namespace std;
class ChairMan { private: ChairMan(){ cout << "create super" << endl; } public: static ChairMan *singleMan;
};
ChairMan * ChairMan::singleMan = new ChairMan;
int main(int argc, char *argv[]) { cout << "main" << endl; ChairMan::singleMan;
ChairMan *cm1 = ChairMan::singleMan;
system("pause"); return 0; }
|
安全的改进
#include <iostream>
using namespace std;
class ChairMan { private: ChairMan(){ cout << "create super" << endl; } ChairMan(const ChairMan &ch) {}; private: static ChairMan *singleMan; public: static ChairMan* getInstance() { return singleMan; } };
ChairMan * ChairMan::singleMan = new ChairMan;
int main(int argc, char *argv[]) { ChairMan * cm1 = ChairMan::getInstance(); ChairMan * cm2 = ChairMan::getInstance(); if (cm1 == cm2) cout << "相等" << endl;
ChairMan *cm3 = new ChairMan(*cm2); if (cm2 == cm3) cout << "不相等" << endl;
system("pause"); return 0; }
|
打印机的单例模式案例。
#include <iostream> #include <string>
using namespace std;
class Printer { private: static Printer * singlePrinter;
private: Printer(){ }; Printer(const Printer & ptr);
public: static Printer * getInstance() { return singlePrinter; } static void PrintText(string text) { cout << text << endl; } };
Printer * Printer::singlePrinter = new Printer;
int main(int argc, char *argv[]) { Printer * ptr = Printer::getInstance();
ptr->PrintText("hello lyshark");
system("pause"); return 0; }
|
this 指针: this指针指向被调用的成员函数所属的对象,
#include <iostream> #include <string>
using namespace std;
class Person { public: char *name; int age;
public: Person(char *p_name, int p_age) { this->name = p_name; this->age = p_age; }
void Compare_Age(Person & ptr) { if (this->age == ptr.age) cout << "Same age" << endl; else cout << "Same not age" << endl; }
void PlusAge(Person & ptr) { this->age += ptr.age; }
Person & Push_Age(Person &ptr) { this->age += ptr.age; return *this; }
};
int main(int argc, char *argv[]) { Person per1("lyshark", 33); Person per2("admin", 33); per1.Compare_Age(per2); per1.PlusAge(per2); cout << per1.age << endl;
per1.Push_Age(per2).Push_Age(per2); cout << per1.age << endl;
system("pause"); return 0; }
|
空指针访问成员函数: 如果用不到this则可以调用,用到的话就会报错。
#include <iostream> #include <string>
using namespace std;
class Person { public: int m_age;
public: void show() { cout << "person show" << endl; } void show_age() { if (this == NULL) return; cout << "show: "<< m_age << endl; } };
int main(int argc, char *argv[]) {
Person *ptr = NULL;
ptr->show(); ptr->show_age();
system("pause"); return 0; }
|
常函数、常对象: 使用const 修饰成员函数,则是常函数,
#include <iostream> #include <string>
using namespace std;
class Person { public: int m_x; int m_y;
public: Person() { this->m_x = 0; this->m_y = 0; }
void showInfo() const { cout << this->m_x << endl; cout << this->m_y << endl; } };
int main(int argc, char *argv[]) { Person per1; per1.showInfo();
const Person per2;
system("pause"); return 0; }
|
友元函数的定义(全局函数): 将全局函数定义为友元函数,让外部函数,可以访问类内部的私有数据。
#include <iostream> #include <string>
using namespace std;
class Building {
friend void goodGay(Building *building); private: string m_badRoom; string m_sittingRoom;
public: Building() { this->m_sittingRoom = "客厅"; this->m_badRoom = "卧室"; } };
void goodGay(Building *building) { cout << "访问我的客厅:" << building->m_badRoom << endl; cout << "访问我的卧室:" << building->m_sittingRoom << endl;
}
int main(int argc, char *argv[]) { Building *building = new Building; goodGay(building);
system("pause"); return 0; }
|
让整个类做友元类:
#include <iostream> #include <string>
using namespace std;
class Teacher { friend class Student;
private: char * m_school; char * m_class;
public: Teacher() { this->m_school = "中心小学"; this->m_class = "一年级二班"; } };
class Student { private: Teacher *ptr;
public: Student() { ptr = new Teacher; } void Display() { cout << "学生访问到的学校: " << this->ptr->m_school << endl; cout << "学生访问到的班级: " << this->ptr->m_class << endl; } };
int main(int argc, char *argv[]) {
Student stu; stu.Display();
system("pause"); return 0; }
|