C++是第一个被程序员广泛使用的面向对象的语言,其很多优点都被其它面向对象的语言(如java,python)用来借鉴,但要想写出规范性的代码,还需要掌握很多方法,本系列文章从C++的基础和规范化两个方面进行介绍。
C++基础
介绍
- 编写C++ class--基于对象(Object Based)
- 学习class之间的关系--面向对象(Object Oriented)
- 推荐书籍C++ Primer(百科全书);Effiective C++(设计思维),STL库。
C++ vs. C
- c中定义的数据是全局的,没有访问级别的限制。
- 引入头文件
c++引入头文件使用、不使用后缀名.h都可以,原因是C++的发展,后缀名不一定是.h或.cpp,还有可能是.hpp,无后缀名或者其它形式,所以在引入库中的头文件时,无需添加后缀名。
c引入的头文件也可以去掉后缀名.h,但需要在前面添加“c”来标识。
C++类书写规范话的第一步(防止重复加载声明)
#pragma once //.h文件中添加该声明,防止重复加载
class ClassDefine
{
};
等同于如下方式
#ifndef CLASS_DEFINE //.h文件中添加该声明,防止重复加载
#define CLASS_DEFINE
class ClassDefine
{
};
#endif
C++类头文件的结构
- #define声明
- 前置声明
- 类声明
- 类定义(也可以放在.cpp文件中)
inline-内联函数
#pragma once
class Complex
{
public:
// 使用初始化赋值是规范化的一种表现
// 执行效率高
Complex(double r, double i)
:re(r), im(i)
{}
// 声明同时直接定义函数,这样IDE会将该函数自动指定为inline函数的候选
// inline函数执行效率高
// 一般简单的函数才会变为inline,复杂的函数不会变为inline
// 该函数是不是inline由IDE决定
double getRe() const
{
return re;
}
double getIm() const
{
return im;
}
private:
double re, im;
};
//主动声明为inline函数,具体情况和上述一致
inline double getIm(const Complex& x)
{
return x.getIm();
}
类的相关知识
- 访问级别
- private, protect, public
- 构造函数
- 和类同名,无返回值。
- 使用初始化列表方式可以提高效率。
- 构造方法设置为private级别,是单例设计模式的常用方式。
- 重载
- 友元
- 友元函数可以获取friend中的成员
- 相同class的不同对象互为友元
- 操作符重载
- operator +():支持成员函数和全局函数两种方式。
- 运算符重载,需要注意返回值类型(如cout<<"hello";--无需返回值,而cout<<"hello"<<"world";--这样连续使用就需要返回值)。
常量成员函数
成员函数不修改对象中的状态,可以设置为常量函数,这也是规范化的写法。
#include<iostream>
using namespace std;
class Image
{
public:
Image(int width, int height)
{
m_width = width;
m_height = height;
}
// 该函数不会改变对象的数据
// 如果不声明为常量函数,const对象调用该函数,会报错。
// main()方法中调用该函数会报错
void info()
{
cout << "width= " << m_width << ", height= " << m_height << endl;
}
private:
int m_width;
int m_height;
};
int main()
{
const Image image1(10, 20);
// 调用该方法会报错
image1.info();
system("pause");
return 0;
}
value和reference
- 传递参数
- 尽量使用reference(by reference)
- 如果不修改该对象,则设置为const(by reference to const)
- 返回参数
- 尽量使用reference
- 局部新创建的对象,不能使用reference返回。
- 传递者无需知道接受者是以reference的形式来接受,这样的特点使reference大大优化与指针
成员函数和全局函数
- 成员函数有隐藏this变量,指向类对象本身。
- 全局函数没有this变量。
- 根据具体的情况进行选用(如在复数类中定义double+复数函数,定义全局函数较好)。