C++ 学习笔记
C++ 宏
本质来讲,宏就是在预处理过程中替换字符串。通过#define做到。
C++ 宏定义将一个标识符定义为一个字符串,源程序中的该标识符均以指定的字符串来代替,C++的三个主要的预处理命令之一(C语言的预处理主要有三个方面的内容: 1.宏定义; 2.文件包含; 3.条件编译。 预处理命令以符号“#”开头)。
定义的格式有如下几种:
#define <宏名> <宏体>
其中, <宏名>是一个标识符,<宏体>是被替换用的字符串。
例如:
#define PI 3.14
定义改代码后,把程序中全部的标识符PI换成3.14。
#define <宏名>(<参数表>) <宏体>
其中, <宏名>是一个标识符,<参数表>中的参数可以是一个,也可以是多个,视具体情况而定,当有多个参数的时候,每个参数之间用逗号分隔。<宏体>是被替换用的字符串,宏体中的字符串是由参数表中的各个参数组成的表达式。
例如:
#define F(a,b) a+b
如果在程序中出现如下语句,
int r,a=1,b=1;
r=F(a,b);
则被替换为:
r=a+b;
注意事项:
预处理命令后通常不加分号,宏定义也不例外,由于宏定义只是用宏名对一个字符串进行简单的替换,因此如果在宏定义命令后加了分号,将会连同分号一起进行置换。
使用#define定义的标识符不是变量,它只用作宏替换,因此不占有内存。
习惯上用大写字母表示<宏名>,这只是一种习惯的约定,其目的是为了与变量名区分,因为变量名通常用小写字母。
宏定义可以嵌套,已被定义的标识符可以用来定义新的标识符。
在书写带参数的宏定义时,<宏名>与左括号之间不能出现空格,否则空格右边的部分都作为宏体。
在书写#define 命令时,注意<宏名>和<宏体>之间用空格分开,而不是用等号连接
C++ 接口
C++ 不像java,c#有自带的Interface来实现接口,需要自己通过virtual function 来实现接口,从而达到定义与实现的分离。
接口宏定义
//********************************************
// Interface.h
//主要是宏定义一些关键词,可以形成接口类
//********************************************
#ifndef INTERFACE_H
#define INTERFACE_H
#define Interface class
#define DeclareInterface(name) Interface name { \
public: \
virtual ~name() {}
#define DeclareBasedInterface(name, base) class name : \
public base { \
public: \
virtual ~name() {}
#define EndInterface };
#define implements public
#endif
接口类.h
//***********************************************
// IBar.h
//通过宏定义生成我们的接口类,写一些纯虚函数
//***********************************************
#ifndef IBAR_H
#define IBAR_H
#include "Interface.h"
DeclareInterface(IBar)
virtual int GetBarData() const = 0;
virtual void SetBarData(int nData) = 0;
EndInterface
#endif
父类.h
//***********************************************
// BasicBar.h
//Bar类的父亲类,用来继承测试
//***********************************************
#ifndef BASICBAR_H
#define BASICBAR_H
#include <iostream>
class BasicBar
{
public:
BasicBar(int x)
{
}
~BasicBar(){}
virtual int getBarData1() const
{
std::cout <<"Get BasicBar!";
return 0;
}
virtual void setBarData1(int nData)
{
}
};
#endif
接口类实现.cpp
//***********************************************
//Bar.h
//实现IBar接口的类
//***********************************************
#ifndef Bar_H
#define Bar_H
#include "Interface.h"
#include "BasicBar.h"
#include "IBar.h"
#include <iostream>
class Bar :public BasicBar,implements IBar
{
public:
Bar(int x=0) : BasicBar(x)
{
}
~Bar(){}
virtual int getBarData() const
{
std::cout <<"Get Bar!";
return 0;
}
virtual void setBarData(int nData)
{
}
};
#endif
主函数
//***********************************************
// main.h
//主函数
//***********************************************
#include <QtCore/QCoreApplication>
#include "IBar.h"
#include "DataAccess.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//IBar *bar = new Bar();
IBar *bar = DataAccess::createBar();
bar->getBarData();
delete bar;
return a.exec();
}
参考
https://blog.csdn.net/imxiangzi/article/details/50839221?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162459086716780262514988%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=162459086716780262514988&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-2-50839221.first_rank_v2_pc_rank_v29_2&utm_term=c%2B%2B+%E6%8E%A5%E5%8F%A3+%E5%AE%9E%E7%8E%B0&spm=1018.2226.3001.4187