You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

4.7 KiB

title date categories tags
C++建库中遇到的坑 2020-06-16 15:43:54 [tech] <nil>

由于学校课程安排,作为一只电气狗第一次正经的开始搞Cpp ::aru:shy:: 特记录一些建库过程遇到的坑,,→_→

关于.h文件

作为头文件,.h中一般放有相应类及函数的声明。 一个典型的.h文件如下:(FileName: yimian.h)

#ifndef YIMIAN_H //防止本文件被多次编译
#define YIMIAN_H //'YIMIAN_H'的值需自定义

//.h中可能用到的lib
#include<iostream>
#include<string>

using namespace std; //使用std命名空间,这样下面就可以不用写如std::cout了

//声明yimian类
class yimian{
  public:  //公共域(可外界直接调用)
  void hi();
    static string version;

    private:  //私有(不对外公开)
};

#endif //与文件开头防多次编译相对应

为了安全起见,函数以及变量的初始化一般不放在.h文件中进行。而是习惯于建一个新的同名.cpp文件。 下面是一个与上午相对应的.cpp文件示例:(FileName: yimian.cpp)

#include"yimian.h" //需要指向yimian.h

string yimian::version = "Version 0.0.1"; //为字符串变量赋值

void yimian::hi(){ //定义yimian类中hi()函数内容
  cout << "Hellow Yimian~" << endl; //输出"Hellow Yimian~\n"到屏幕
}

有了以上文件,一个简单的C++库就建成了φ( ̄∇ ̄o) 于是我们新建一个test.cpp文件用来放置main()

#include<iostream> //要用到的lib声明
#include<stdio.h>
#include"yimian.h" //引入自定义lib

  using namespace std; //使用std命名空间

  int main(){
    yimian $; //定义一个名字为$的新yimian类

    $.hi(); //调用yimian类中hi()函数
    cout << $.version<< endl; //将yimian类version变量输出到屏幕

    return 0; //主函数结束
}

然后便可以愉快的使用g++编译啦,指令如下:(win如何搭建GNU环境)

  $ g++ test.cpp yimian.cpp -o [目标文件的名称]

之后命令行启动编译好的程序 (什么是命令行⌇●﹏●⌇)

  $ ./目标文件名称.exe

如你所料,以上程序的运行结果为:

Hellow Yimian~ Version 0.0.1


::aru:meditation::

  • 头文件中声明定义好的类貌似一定要在main()中实例化(调用)才行,不然会报错

总结一下类相关知识

类访问修饰符

  • **public: **类内外皆可访问的内容
  • **private: **类外不可访问,仅可自己和友元访问,子类不可访问
  • **protected: **外部不可访问,自己、友元和子类可访问

特殊函数类型

  • **构造函数:**每次创建对象时会执行,即初始化
class Line{
  public:
    void setLength( double len );
    double getLength( void );
    Line();  // 这是构造函数
 
  private:
    double length;
};
  • **析构函数:**删除对象时执行的函数,即善后
class Line{
  public:
    void setLength( double len );
    double getLength( void );
    Line();   // 这是构造函数声明
    ~Line();  // 这是析构函数声明
 
  private:
    double length;
};
  • **拷贝构造函数: **实现复制对象时同一类对象间传参
class Line{
  public:
  int getLength( void );
    Line( int len );             // 简单的构造函数
    Line( const Line &obj);      // 拷贝构造函数
    ~Line();                     // 析构函数
 
  private:
    int *ptr;
};
·········
Line::Line(const Line &obj){
  cout << "调用拷贝构造函数并为指针 ptr 分配内存" << endl;
  ptr = new int;
  *ptr = *obj.ptr; // 拷贝值
}
·········
int main( ){
  Line line1(10);
 
  Line line2 = line1; // 这里也调用了拷贝构造函数
 
  return 0;
}
  • 构造与拷贝构造区别:
A x(2);  //直接初始化,调用构造函数
A y = x;  //拷贝初始化,调用拷贝构造函数

友元函数/类

  • **友元:**友元就像老邻居啦,家里东西随便拿
class INTEGER{
  friend void Print(const INTEGER& obj);//声明友元函数
};

void Print(const INTEGER& obj{
  //函数体
}

void main(){
  INTEGER obj;
  Print(obj);//直接调用
}

内联函数

  • 总之行数很少,功能很简单,没有循环和开关语句,想提高函数效率,就用内联(╯‵□′)╯︵┴─┴
inline int Max(int x, int y){
  return (x > y)? x : y;
}

// 程序的主函数
int main(){
  cout << "Max (20,10): " << Max(20,10) << endl;
  cout << "Max (0,200): " << Max(0,200) << endl;
  cout << "Max (100,1010): " << Max(100,1010) << endl;
  return 0;
}

this指针

  • 类似js中this,指向参数对象本身


To Be Continued..