C++ 学习笔记

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值