zoukankan      html  css  js  c++  java
  • 在C++中定义常量的两种方法的比较

    在C++中,要定义一个常量,有两种主要的做法

    1. 符号常量 (#define)

    2. 常值变量 (const)

    符号常量的定义方式,其实与C++本身没有关系,它是一个编译器指令,或者称为预处理指令(有关的预处理指令还有#include,#ifdefine等等)。它的用法如下

    #define PI 3.1415926

    这样的语法就定义了一个叫做PI的符号常量,它的值指定为3.1415926.

    【注意】因为它其实不是C++语法,所以它不需要(也不能)用分号结束。

    我们怎么使用呢

    #include <iostream>
    #define PI 3.1415926

    using namespace std;

    int main()
    {
        double Area(int radio);//声明方法
        cout<< Area(2)<<endl;
        return 0;
    }

    double Area(int radio)//实现方法,这是一个根据半径计算面积的方法
    {
        return PI*radio*radio;
    }

     

    与符号常量相对的,常值变量需要通过const关键字定义。相对来说,const更加现代,它是c++的一个关键字,它的用法如下

    const double PI=3.1415926;

    我们把上面的代码转换一下

    #include <iostream>

    using namespace std;

    const double PI=3.1415926;

    int main()
    {
        double Area(int radio);//声明方法
        cout<< Area(2)<<endl;
        return 0;
    }

    double Area(int radio)//实现方法,这是一个根据半径计算面积的方法
    {
        return PI*radio*radio;
    }

     

    总结起来说,我们推荐用const,而不是#define预处理指令

    1. const可以定义数据类型,提高了类型安全性。例如,我们上面可以指定PI这个常量是double类型

    2. const既然是变量(这里有点别扭,它其实是不变的,但名称叫做常值变量),那么就有地址,适用面更加广

    3. 语法上也更好理解一些

     

    题外话:在C#中能不能使用符号呢?

    C#中也可以使用符号定义,例如下面这样

    #define MINI

    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {

    #if MINI
                Console.WriteLine("你定义了MINI符号");
    #endif

                Console.Read();
            }
        }

    }

    一般这样做的目的都是为了改变编译行为。因为#define是编译器指令

    除了用#if这样的条件编译语句之外,我们还可以用Conditional指令

    #define MINI

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Diagnostics;

    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {

    #if MINI
                Console.WriteLine("你定义了MINI符号");
    #endif

                //按条件调用方法
                SomeMethod();

                Console.Read();
            }

            [Conditional("MINI")]//Conditional 是一个新的Attribute,可以进行条件编译,本例的意思是只有定义了MINI这个符号的情况下,才将该方法编译进去。否则,任何其他调用处都将放一个空白。
            static void SomeMethod()
            {
                Console.WriteLine("你调用了我的方法");
            }
        }

    }

    但是conditional只能针对void方法,这其实很好理解。因为你要知道,它可能被替换掉,就是可能不被编译。如果它有返回值,而且该值需要被其他程序代码使用,那不就是麻烦了吗

  • 相关阅读:
    Windowless controls
    System进程无法创建一个Administrator用户的子进程
    PE文件分析工具
    使用IHTMLDocument3 的getElementById获取控件总是返回空的解决方法
    Windows Sockets2 详解2——堵塞与非堵塞模式
    CopySourceAsHtml外部工具版
    像使用C#一样使用C++
    Windows Sockets2 提供者专用扩展机制
    Windows Sockets2 详解1——服务器客户端通讯
    腾讯实习面试(二)
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/1498370.html
Copyright © 2011-2022 走看看