构造函数():属性1(值1),属性2(值2)...{}
class Person
{
person(int a, int b, int c): m_a(a), m_b(b), m_c(c)
{
}
};
void test()
{
Person person(10, 20, 30);
}
c++中类的成员可以是另一个类的对象, 称为对象成员
对象成员先构造后析构
例如:
class A{};
class B
{
A a;
};
#include <iostream>
using namespace std;
#include <string>
//手机类
class Phone
{
public:
Phone(String pName): m_PName(pName){}
String m_PName;
};
class Person
{
public:
Person(string name, String pName): m_Name(name), m_Phone(pName){}
String m_Name;
String m_Phone;
};
void test(){
Person p("张三", "手机");
}
在成员变量和成员函数前加 static
关键字, 称为静态成员
访问方法: 静态成员可以使用对象访问, 也可以使用类名访问
静态成员也是有访问权限的
class Person
{
public:
static int m_A;
};
int Person::m_A = 100;
void test()
{
Person p;
//对象访问
cout << p.m_A << endl;
//类名访问
cout << Person::m_A << endl;
}
空对象的 sizeof 为 1, 若不是空的就是该多少多少
只有非静态成员变量属于类的对象上
this指针指向被调用的成员函数所属的对象
用途:
解决名称冲突
返回对象本身
可以链式编程
class Person
{
public:
Person(int age):m_Age(age){}
int m_Age;
Person& PersonAddAge(Person &p)
{
m_Age += p.m_Age;
return *this;
}
};
void test()
{
Person p1(10):
Person p2(10);
p2.PersonAddAge(p1).PersonAddAge(p1).PersonAddAge(p1);
cout << "p2.m_Age=" << p2.m_Age;
}
空指针可以访问成员函数, 但容易引发空指针报错. 可以加
if (this==NULL){
return;
}
来解决
常函数:
成员函数加 const 后, 称这个函数为常函数
void fun() const{}
这个const修饰的是this指针, 让指针修饰的值也不可修改
常函数内不可以修改成员属性
成员属性声明时加关键字 mutable 后, 在常函数中仍可以修改
常对象:
目的: 让一个函数或者类访问另一个类中的私有成员
三种实现:
全局函数做友元
class Building
{
//友元声明
friend void fun();
private:
int a;
};
void fun(Building building)
{
cout << a << endl;
}
类做友元
class Building
{
//友元声明
friend class C;
private:
int a;
};
成员函数做友元
class Building
{
//友元声明
friend Class::fun();
private:
int a;
};
对已有的运算符进行重新定义, 赋予其另一种功能, 以适应不同的数据类型
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;
}
//使用
Person p3 = p1.operator+(p2);
//简化为
Person p3 = p1 + p2;
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;
}
//使用
Person p3 = operator+(p1, p2);
//简化为
Person p3 = p1 + p2;
在操作数类型不同时, 运算符重载也可以发生函数重载
内置数据类型不能重载
<<
重载通常不会用成员函数重载左移运算符, 只能用全局函数重载左移运算符
ostream &operator<< (ostream::&cout, Person &p)
{
cout << "m_A = " << p.m_A << "; m_B = " << p.m_B;
return cout;
}
若要访问私有变量就要把这个函数设为友元
类内:
class Myinteger
{
public:
int m_Num;
MyInteger():m_Num(0){}
Myinteger& operator++()
{
m_Num++;
return this;
}
};
编译器自己的拷贝是浅拷贝, 在析构时可能会重复释放报错
Person& operator=(Person &p)
{
//编译器提供浅拷贝
//判断堆区是否有属性存在, 若存在先释放
if(m_Age != NULL)
{
delete m_Age;
m_Age = NULL;
}
//深拷贝
m_Age = new int(*p.m_Age);
//返回自身
return *this;
}
//打印输出类
class MyPrint
{
public:
//重载函数调用运算符
void operator()(String test)
{
cout << test << endl;
}
};
void test()
{
MyPrint myPrint;
myPrint("hello world");
}
//加法类
class MyAdd
{
public:
int operator()(int num1, int num2)
{
return num1 + num2;
}
}
void test()
{
MyAdd myAdd;
int res = myAdd(100, 100);
cout << "res = " << res << endl;
//匿名函数对象
cout << MyAdd(100, 100) << endl;
}
?
原文:https://www.cnblogs.com/karlshuyuan/p/14967433.html