1.类基础
1.1.类的声明
一般的习惯是,类的声明和定义分别在头文件和源文件中进行,声明一个类时,使用关键字class
,语法如下:
//Person.h
#include <string>
class Person {
private:
int age;
std::string name;
public:
std::string getName();
void setName(std::string str);
};
1.2.类的定义
在源文件中定义类时,首先引入类声明的头文件,然后使用作用域解析符::
来标记类的方法,如:
//Person.cpp
#include "Person.h"
std::string Person::getName() {
return name;
}
void Person::setName(std::string str) {
name = str;
}
在main文件中使用这个类时:
//cls1.cpp
#include <iostream>
#include "Person.h"
int main()
{
using namespace std;
Person p;
p.setName("zhangsan");
cout << p.getName() << endl;
return 0;
}
1.3.访问修饰符
在类声明时看到了public
和private
修饰符,C++中有三种访问修饰符:
- public:该类对象都可以访问;
- private:只有通过公有成员函数才可以访问;
- protected:子类和该类对象可以访问;
通常,属性使用
private
修饰,而成员函数被public
修饰,默认为private
。
1.4.成员函数
- 1.定义成员函数时,使用作用域解析符
::
标记函数所属的类; - 2.类方法可以访问类的
private
组件; - 3.在类声名中定义的成员函数,将自动成为内联函数,因此,类声明中一般将于短小的函数作为内联函数。
- 4.可以通过关键字
inline
在类定义时定义该成员函数为内联。
2.构造函数
构造函数不是用来让对象调用的,而是用来创建类的对象的,每次创建类的对象,都会调用构造函数。
2.1.声明和定义构造函数
构造函数的名称和类相同,如对于Person类,我们可以定义如下的构造方法:
//Person.h
#include <string>
class Person {
public:
Person(std::string name, int age);
};
//Person.cpp
Person::Person(std::string name, int age) {
m_name = name;
m_age = age;
}
通过函数的重载,可以定义多个特征标不同的构造函数。
2.2.使用构造函数
当定义好构造方法后,根据构造方法来创建对象:
Person p1("zhangsan",12);
第二种方式如下:
Person p1 = Person("zhangsan",12);
第三种方式是通过new
来创建一个匿名对象,并返回该对象的地址:
Person *p = new Person("zhangsan",12);
第四种方式,在c++11中,可通过列表初始化,但必须提供和某个构造函数的参数列表一致的内容,如:
Person p1 = {"zhangsan",23};
2.3.默认构造函数
如果不显式提供构造函数,则编译器会提供默认构造函数。
通常的做法是应提供对所有类成员做初始化的默认构造函数。
3.析构函数
当类的对象销毁时,程序将自动调用该类的析构函数。
3.1.作用
用来完成清理工作。
3.2.声明和定义析构函数
析构函数在类名前加上~
表示,且不带有任何参数,如下所示:
//Person.h
#include <string>
class Person {
public:
~Person();
};
//Person.cpp
Person::~Person() {
//......
}
3.3.使用析构函数
和构造函数一样,析构函数由编译器调用,不能使用类的对象去调用析构函数,那么它什么时候被调用呢?
- 1.如果创建的是静态存储类对象,则其析构函数在程序结束后自动被调用;
- 2.如果创建的是自动存储类对象,则其析构函数在程序执行完对应代码块时被调用;
- 3.如果对象通过
new
创建,则只有在delete
时,才会调用析构函数。
如果没有显式地定义析构函数,则编译器将提供一个默认析构函数。
4.const成员函数
使用const
修饰成员函数,可以保证函数不会修改调用对象,称为const成员函数,声明和定义时将const
放在函数括号的后面:
std::string getName() const;
std::string Person::getName() const {
//......
}
5.this指针
对于每个成员函数,都存在一个this指针,它指向用来调用成员函数的对象。
因此,如果成员函数需要引用这个调用对象,则可以使用*this
。
const成员函数将
this
限定为const,因此将不能通过this指针来修改调用对象的值。
6.静态成员变量
类中使用static
限定的成员变量为静态成员变量,静态类成员变量有一个特点:不管创建多少对象,只创建一个静态变量的副本,因此,同一个类的所有对象都使用同一个静态变量。
同时需要注意:不能在类声明中初始化静态成员变量,因为声明仅仅描述如何为类分配内存,但并不会分配内存。
7.静态成员函数
将成员函数使用static
限定,则该成员函数为静态成员函数,静态成员函数将不和特定的对象关联,只和该类有关。注意事项总结有以下几点:
- 1.静态成员函数不能通过对象来调用;
- 2.由于1,静态成员函数中不能使用
this
指针; - 3.由于1,因此只能使用静态数据成员;
关于静态方法的调用,如果是public
的静态成员函数,则可以在外部使用类名加作用域解析符进行调用,如:
static void show();
MyClass::show();