1.类定义
c++类的定义是通过class或者struct关键字实现,两者都是一样的,只不过class默认成员是私有,struct默认是公有。
class MyString{};
访问权限:private,public,protected
2.构造函数和析构函数
构造函数名和类名是一样的,而且没有返回值
class MyString
{
public:
MyString(); //构造函数
~MyString(); //析构函数
};
定义对象时候,会调用构造函数,无论是用new 定义还是直接定义;
int main()
{
MyString str1;
MyString* str2 = new MyString;
}
这两种方式都会调用构造函数
(1)转换构造函数
class MyString
{
public:
MyString();
MyString(char *str); //转换构造函数
}
int main()
{
MyString s = "hello world"; //这里调用的就是转换构造函数
s = "hello"; //先会调用转换构造函数,新建个临时对象,然后再通过赋值
return 0;
}
这里其实是一种隐式转换,如果你不想进行隐式转换,可以在函数名前加上explicit关键字。
(2)初始化列表
构造c++对象的时候,可以通过初始化列表对对象的成员变量进行初始化。
MyString::MyString() : _len(0) //初始化列表
{}
类中的const,引用这些都是无法赋值的,必须通过初始化列表初始化。
(3)拷贝构造
拷贝构造就是用该类的其它对象来初始化本对象。
MyString(const MyString& s); //拷贝构造函数
(4)深拷贝和浅拷贝
默认拷贝构造函数是浅拷贝,MyString类中肯定包括一个char*的指针,浅拷贝就是只拷贝指针,并没有拷贝数据。
MyString::MyString(const MyString& str)
{
int len = strlen(str);
if ((m_len + len) < m_capacity)
{
memcpy(m_str + m_len, str, len);
m_len += len;
m_str[m_len] = 0;
return *this;
}
char* p = new char[m_capacity * 2];
memset(p, 0, m_capacity * 2);
memcpy(p, m_str, m_len);
delete[]m_str;
m_str = p;
m_capacity *= 2;
return operator+=(str);
}
3.类默认生成函数
一个空的c++类,会有以下6个默认函数
class MyString
{
public:
MyString(); //构造函数
MyString(const MyString& s); //拷贝构造函数
~MyString(); //析构函数
MyString& operator=( const MyString& ); // 赋值运算符
MyString* operator&(); // 取址运算符
const MyString* operator&() const; // 取址运算符 const
};
4.运算符重载
单目运算符重载为成员函数
双目运算符重载为友元函数,.=()[]->无法重载为友元。
大多数运算符都可以重载,但是以下运算符不能重载:
. (成员访问运算符)
.* (成员指针访问运算符)
:: (域运算符)
sizeof (长度运算符)
?: (条件运算符)
(1)operator=
MyString& MyString::operator = (const char* str)
{}
有的时候我们需要能够实现连续=,这时候我们必须返回MyString&
(2)operator+
MyString MyString::operator + (const char* str);
这里我们调用的时候,只能这样调用:
MyString str;
str + "hello";
"hello" + str;//这样调用会报错
如果我们需要这样调用,我们可以实现一个友元函数:
MyString operator+(const char* str, const Mystring& ms);
(3)++
++重载分为两种,i++和++i,如何来区分这两种重载呢?
operator++(int):代表i++
operator++():代表++i
(4)<<
<<重载需要写成友元函数,例如:
ostream& operator<<(ostream& out, const MyString& str);
(5)operator int
(6)operator new
new 是先分配空间,后调用构造
delete是先调用析构函数,后销毁空间
5.友元
6.static与类
成员变量:
被对象共享,但是不属于对象;
类名可直接访问
成员函数:
没有this指针(没法访问非静态成员,变量,函数)
单例模式:
const与类
const函数与非const函数能构成重载
一般会用非const版本,去调用const版本