初识类
一个 demo 完事:
#include <iostream>
#include <fstream>
#include <string>
#include <cstring>
using namespace std;
class Student {
enum { SEX_LEN = 5 };
string name;
string id;
char sex[SEX_LEN];
unsigned int age;
public:
Student();
Student(const string &name, const string &id, const char* sex, unsigned int age);
void show() const;
const Student& who_age(const Student& stu) const;
};
int main()
{
Student Bob("Bob", "20213333", "m", 18);
Student Tom{"Tom", "22223333", "m", 20};
Bob.who_age(Tom).show();
return 0;
}
Student::Student()
{
name = "No";
id = "No";
strcpy(sex, "No");
age = 0;
}
Student::Student(const string &name, const string &id, const char* sex, unsigned int age)
{
this->name = name;
this->id = id;
strncpy(this->sex, sex, SEX_LEN-1);
this->age = age;
}
void Student::show() const
{
cout << "Name: " << name << ", "
<< "id: " << id << ", "
<< "sex: " << sex << ", "
<< "age: " << age << endl;
}
const Student& Student::who_age(const Student& stu) const
{
return stu.age>age?stu:*this;
}
主要来看下 IDA,感觉识别的不是很好啊:
当然这里涉及到了 string 类了,这里后面 STL 的时候再说吧。
运算符重载与友元
运算符函数格式:operatorop(arg-list) ==> operator=() 表示重载 = 运算符
一个 demo 完事:
#include <iostream>
#include <fstream>
#include <string>
#include <cstring>
using namespace std;
class Point {
private:
int x;
int y;
friend ostream& operator<<(ostream& out, const Point &p);
friend Point operator*(const Point& p, int n);
friend Point operator*(int n, const Point& p);
public:
Point() { x = 0; y = 0; }
Point(int x, int y);
Point operator+(const Point& p) const;
Point operator*(const Point& p) const;
Point operator++(); // 前置++
Point operator++(int); // 后置++
void show() const;
};
int main()
{
Point p1(2, 3);
Point p2(1, 2);
Point p3(4, 2);
Point p = p1 + p2 * p3;
p.show();
Point p4 = ++p1;
Point p5 = p4++;
cout << "p4 = " << p4 << endl;
cout << "p5 = " << p5 << endl;
cout << "p5*2 = " << p5*2 << endl;
cout << "2*p4 = " << 2*p4 << endl;
return 0;
}
Point::Point(int x, int y)
{
this->x = x;
this->y = y;
}
Point Point::operator+(const Point& p) const
{
cout << "oprator +\n";
return Point(x+p.x, y+p.y);
}
Point Point::operator*(const Point& p) const
{
cout << "oprator *\n";
return Point(x*p.x, y*p.y);
}
Point Point::operator++()
{
cout << "oprator ++p\n";
return Point(++x, ++y);
}
Point Point::operator++(int)
{
cout << "oprator p++\n";
return Point(x++, y++);
}
ostream& operator<<(ostream& out, const Point& p)
{
out << "(" << p.x << ", " << p.y << ")";
return out;
}
Point operator*(const Point& p, int n)
{
return Point(p.x*n, p.y*n);
}
Point operator*(int n, const Point& p)
{
return Point(p.x*n, p.y*n);
}
void Point::show() const
{
cout << "(" << x << ", " << y << ")\n";
}
这里关键的地方就是对二元运算符的重载,比如在重载 * 运算符时,我们希望 2*p,但是我们知道成员函数的第一个参数才是 this 指针,所以这里通过成员函数就无法完成重载,这里就得使用友元函数。
友元有友元函数,友元类,友元成员函数,这里仅仅用到友元函数,简单来说就是友元函数与成员函数具有相同的访问私有数据的权限。
使用也很简单:
1)加上 friend 关键字
2)将函数声明放在类中
最后输出如下:
oprator *
oprator +
(6, 7)
oprator ++p
oprator p++
p4 = (4, 5)
p5 = (3, 4)
p5*2 = (6, 8)
2*p4 = (8, 10)
可以看到是先运算的乘法在运算的加法,所以可以知道重载运算符不改变运算符的优先级和结合性。
还有就是注意下前置++和后置++重载的区别。
类 类型转换
todo(感觉不是很重要,所以并不打算写,但是如果后面遇到的话,再回来补)