CPP:01-c和cpp的差异

2020-07-06  本文已影响0人  放纵的卡尔

C和CPP的差异

//
// Created by 87572 on 20/7/5.
//
#include "../include/StateOne.h"

using namespace std;

/**
 * K1:-------------------------nameSpace的使用---------------------------------------------
 * 1.namespace : 只能用于全局空间
 * 2.nameSpace可以多处使用同一个名字,但是不能冲突,不可以重复定义某个变量.
 * 3.宏常量不可以定义在nameSpace中.
 * 4.引入了sapce所在的.h文件,也必须显式声明使用那个namespace(无论using 还是::)
 * 5.namespace可以嵌套使用
 *
 */

namespace nameA {

    int a = 10;
    int c = 20;

    //可以嵌套使用
    namespace nameB {

        int b = 20;
    }

}


void useNameSapce() {


    std::cout << nameA::nameB::b << std::endl;

};


//这个用法和下边相同.
namespace nameC {

    int d = 100;

    void innerNameSpaceFun() {

        std::cout << "use  namespace in  .h" << std::endl;
    }

}

void nameC::innerNameSpaceFun2() {

    std::cout << "use  namespace in  .h" << std::endl;
}

namespace nameC {
    // int d=200;//和上边冲突了.
}

/**
 * K2:----------------------const的一些小细节------------------------------------------
 * const的使用.
 *
 * ***以下只是测试,不要对const的类型修改内容.这样违背了最初的定义.***
 *
 * 1.不可以对全局变量的const 取地址修改.包括基本类型和结构体
 * 2.结构体,可以对局部变量的const取地址修改
 * 3.不可以对局部变量的基本类型的const修改地址内容,改了也白改.
 *
 * ------------(但是不要这么做)----------------------------------------
 *
 * 3.在CPP中 const默认修饰的内部链接.可以在多个文件中使用同名的a.
 * 4.const Person person1 ->不可以修改指向,不可以修改内容
 *   const Person *person2->不可以修改内容,可以指向别的指针.
 *   const Person * const person3->什么都不可以了.
 * 5.   extern const int  a=100; 不加extern 只能在本文件中有效; 加上extern全局有效.
 * 6.加入.h 中定义了extern a变量.这个.h如果引入的话就会重复了. 所以不能引入.只能定义extern一个未赋值 运行的时候去找这个定义的.
 * 7.声明一个类型则不受影响.可以引入.h  但是不能重复定义.
 *
 *
 */

const struct Person cPerson = {10};

void useConst() {
    const struct Person person = {10};

    Person *p = const_cast<Person *>(&person);
    p->age = 20;
    cout << p->age << endl;

    /* Person *p2 = const_cast<Person *>(&cPerson);
     p2->age = 120;
     cout << p2->age << endl;*/

    const int b = 20;
    // int *pa=&a;
    int *pb = (int *)(&b);
    *pb = 80;
    cout << b << endl; //result: 20  修改不成功,也不要这么做.

    const Person person1 = {10};
    // person1.age=20; 不可以修改
    //person1= nullptr;//也不可以修改指向
    const Person *person2 = &person1;
    // person2->age=20; 不可以修改
    person2 = nullptr;//但可以指向别的指针

    const Person *const person3 = &person1;
    // person3= nullptr;  不可以修改指向

}

/**
 * K3:--------------extern "C"---------------------
 * 1.cpp中会对函数名称进行修改,这样就无法找到c的方法的实现了,所以想要调用c的方法,需要按照c的规则编译.
 * 2.可以在头文件中加入 extern "C"  或者自己在方法中加入.
 *
 */

# ifdef __cplusplus

extern "C" {

# endif

void useExternC();

#ifdef __cplusplus
};
# endif

//extern "C" void useExternC();

/**
 * K3:--------------全局变量的总结----------------
 *  extern const int  a;
 *  extern int b;
 *
 *  extern const int  a=100;
 *  int  b=200;
 *
 * 1.const的赋值类型的必须加入extern的修饰,否则无法找到.因为const的默认作用域是当前文件.
 * 2.非const的赋值类型的则不需要加入extern的修饰.(最好不加)
 *
 * 3.声明类型则必须加入extern的修饰,否则无法从外界引入值.而且还会导致重复定义.
 *
 * 4.无论什么类型都不能再次引入.h文件,否则就是重复定义了.
 *
 * 5.不要在.h文件中定义全局变量.还需要再次引入到.c或者.cpp中. 直接在.c或者.cpp中引入.
 *   这样也不会出现重复引用的问题.
 *
 *
 */


/**
 * K4:-------------------引用相关知识-------------------------
 * 1.引用的本质就是 int d=10;  int * const &d;  &d=20;  相当于*d=20;
 * 2.
 *
 *
 *
 */
void  useReference(){

    int a=20;
    int &rA=a;

    cout<<&a<<endl;
    cout<<&rA<<endl;


}


上一篇下一篇

猜你喜欢

热点阅读