设为首页 加入收藏

TOP

C++ 文件include规则 常量定义(二)
2015-07-20 17:57:55 来源: 作者: 【 】 浏览:12
Tags:文件 include 规则 常量 定义
r.h" using namespace std; int test() { //auto_ptr p(new person("Cici")); //SmartPointer p(new person("Cici")); //p -> tell(); SmartPointer r(new person("taoqi")); SmartPointer p(new person("Cici")); p -> tell(); { SmartPointer q = p; q -> tell(); r = q; SmartPointer s(r); s -> tell(); } r -> tell(); return 0; } int main(){ test(); return 0; }
//SmartPointer.h
#ifndef SMARTPOINTER_H
#define SMARTPOINTER_H


template
        
         
class SmartPointer
{
public:
  SmartPointer(T* ptr);
  ~SmartPointer();
  SmartPointer(SmartPointer
         
          & sptr); T* operator->(); T& operator*(); SmartPointer
          
           & operator=(SmartPointer
           
            & sptr); T getValue(); protected: T* ref; unsigned* ref_count; }; template
            
              SmartPointer
             
              ::SmartPointer(T* ptr){ ref = ptr; ref_count = (unsigned*)malloc(sizeof(unsigned)); *ref_count = 1; } template
              
                SmartPointer
               
                ::~SmartPointer(){ --*ref_count; if (*ref_count == 0) { delete ref; free(ref_count); ref = NULL; ref_count = NULL; } } template
                
                  SmartPointer
                 
                  ::SmartPointer(SmartPointer
                  
                   & sptr) { ref = sptr.ref; ref_count = sptr.ref_count; ++(*ref_count); } template
                   
                     T* SmartPointer
                    
                     ::operator->() { return ref; } template
                     
                       T& SmartPointer
                      
                       ::operator*() { return *ref; } template
                       
                         SmartPointer
                        
                         & SmartPointer
                         
                          ::operator=(SmartPointer
                          
                           & sptr){ if (this != &sptr) { ref = sptr.ref; ref_count = sptr.ref_count; ++(*ref_count); } return *this; } template
                           
                             T getValue() { return *ref; } #endif 
                           
                          
                         
                        
                       
                      
                     
                    
                   
                  
                 
                
               
              
             
            
           
          
         
        
//person.h

#ifndef PERSON_H
#define PERSON_H

#include 
        
         
#include 
         
           using namespace std; class person { public: person(string name); ~person(void); void tell(); private: string name; }; #endif 
         
        

//person.cpp

#include "person.h"

person::person(string name):name(name){
}
void person::tell(){
  cout << "Hi! I am " << name << endl;
}
person::~person(){
  cout << "Bye!" << endl;
}

另外一篇文章关于内部链接和外部连接的解释:

http://www.cnblogs.com/magicsoar/p/3840682.html


内部链接与外部链接

那么什么内部链接和外部链接又是什么呢?

我们知道C++中声明和定义是可以分开的

例如在vs中,我们可以一个函数声明定义放在b.cpp中,在a.cpp只需再声明一下这个函数,就可以在a.cpp中使用这个函数了

a.cpp

复制代码
void show();

int main()
{
    show();
return 0;
}
复制代码

b.cpp

#include 
        
         
void show()
{
    std::cout << "Hello" << std::endl;
}
        

而通过之前的了解,我们知道每个编译单元间是相互独立不知道彼此的存在的

那么a.cpp又是如何知道show函数的定义的呢

其实在编译一个编译单元(.cpp)生成相应的obj文件过程中

编译器会将分析这个编译单元(.cpp)

将其所能提供给其他编译单元(.cpp)使用的函数,变量定义记录下来。

而将自己缺少的函数,变量的定义也记录下来。

所以可以认为a.obj和b.obj记录了以下的信息

image

然后在链接器连接的时候就会知道a.obj需要show函数定义,而b.obj中恰好提供了show函数的定义,通过链接,在最终的可执行文件中我们能看到show函数的运行

哪这些又和内部链接,外部链接有什么关系呢?

那些编译单元(.cpp)中能向其他编译单元(.cpp)展示,提供其定义,让其他编译单元(.cpp)使用的的函数,变量就是外部链接,例如全局变量

而那些编译单元(.cpp)中不能向其他编译单元(.cpp)展示,提供其定义的函数,变量就是内部链接,例如static函数,inline函数等

好了让我们看下编译单元,内部链接和外部链接比较正式的定义吧

编译单元:当一个c或cpp文件在编译时,预处理器首先递归包含头文件,形成一个含有所有 必要信息的单个源文件,这个源文件就是一个编译单元。

内部连接:如果一个名称对编译单元(.cpp)来说是局部的,在链接的时候其他的编译单元无法链接到它且不会与其它编译单元(.cpp)中的同样的名称相冲突。

外部连接:如果一个名称对编译单元(.cpp)来说不是局部的,而在链接的时候其他的编译单元可以访问它,也就是说它可以和别的编译单元交互。

----------------------------------------------------------------------------------------------------------------------------------------

3. 使用下面两种方式防止重复include:

#ifndef PERSON_H
#define PERSON_H
#endif

或者

#pragma once


4. 给出在定义类内部可用常量,文件作用域常量,全局常量的写法:

a. 类成员变量是无法在成员变量定义的时候初始化的(除非是const static),因此在这个时候,成员变量初始化列表是const变量初始化的唯一机会了。。。写成

class MyClass {

private:

const int a1 = 3;

const char* s1 = "abc";

}

是大错而且特错的!!!!同时注意只能在构造函数的初始化列表里初始化

b. 定义全局变量时,extern int a; 只是声明,并没有定义,但是extern int a = 3却是在定义;当然可以在a.cpp中 extern int a = 3; 在b.cpp 中extern int a;来声明。但是比较规范的做法是

首页 上一页 1 2 3 4 下一页 尾页 2/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇HDU2566 统计硬币 下一篇uva 1378 - A Funny Stone Game(..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: