inline

//inline函数可以有声明和实现,但是必须在同一文件
//inline函数不能分成头文件和实现文件

inline int add(int x, int y)
{   //一般不要放循环语句
  return x + y;
}

//如果是自定义类类型,都要大写首字母
class Computer
{
public://public成员可以在类之外访问
//public成员称为类对外的接口、功能、服务

  //对成员函数采用驼峰方式进行命名
  void setBrand(const char * brand)
  {

    strcpy(_brand, brand);
  }

  void setPrice(double price)
  {
    _price = price;
  }

//protected://保护成员不能在类之外访问
  void print()
  {
    cout << "brand:" << _brand << endl
      << "price:" << _price << endl;
  }

//私有成员尽量放到类的底部
private://私有的成员不能在类之外访问
  char _brand[20];//brand_ / m_brand
  double _price;
};


类的声明和定义

//类的声明
class Computer
{  

//class的默认访问权限是private的

public:
  void setBrand(const char * brand);
  void setPrice(double price);
  void print();

//通过private关键字表现封装的特性
private://类对象占据的空间只与数据成员有关,
//成员函数存储在程序代码区, 不会占据对象的空间

  char _brand[20];
  double _price;
};

//类的实现
void Computer::setBrand(const char * brand)
{
  strcpy(_brand, brand);
}

void Computer::setPrice(double price)
{
  _price = price;
}

void Computer::print()
{
  cout << "brand:" << _brand << endl
    << "price:" << _price << endl;
}


构造函数析构函数

class Computer
{
public:
  Computer(const char * brand, double price)
  : _brand(new char[strlen(brand) + 1]()) //浅拷贝, 只传地址
  , _price(price)
  {
    strcpy(_brand, brand);
    cout << "Computer(const char *, double)" << endl;
  }

  void print()
  {
    cout << " brand:" << _brand << endl
      << " price:" << _price << endl;
  }

  //对象销毁的过程中会自动调用析构函数
  //
  //问题: 执行了析构函数就是销毁了对象

  #if 0
  void release()
  {
    delete [] _brand;
  }
  #endif

  ~Computer()
  {   //析构函数的作用:是用来回收对象申请的资源
    if(_brand) {
      delete [] _brand;
      _brand = nullptr;//NULL
    }
    cout << "~Computer()" << endl;
  }

private:
  char * _brand;
  double _price;
};

//Computer pc2("Xiaomi", 7500);

int test0(void)
{
  {
    Computer pc1("MateBook", 6666);
    cout << ">> pc1: " << endl;
    pc1.print();
  }

  cout << ">> pc2: " << endl;
  // pc2.print();

  //堆空间的对象的销毁,需要手动执行
  Computer * pc3 = new Computer("Thinkpad", 7777);
  cout << ">> pc3: " << endl;
  pc3->print();

  delete pc3;//不要忘了, 执行delete表达式的过程中,就会调用析构函数

  static Computer pc4("Macbook pro", 20000);
  cout << ">> pc4: " << endl;
  pc4.print();

  return 0;
}

void test1()
{
  Computer * pc3 = new Computer("Thinkpad", 7777);
  cout << ">> pc3: " << endl;
  pc3->print();
  pc3->~Computer();//该语句被执行之后,对象是没有被销毁的
  delete pc3;
}

void test2()
{
  Computer pc1("MateBook", 6666);
  cout << ">> pc1: " << endl;
  pc1.print();
  pc1.~Computer();//析构函数可以主动调用,但不推荐这样做
  //析构函数应该让其自动执行
  //pc1.release();
}


拷贝构造函数

class Computer
{
public:
  Computer(const char * brand, double price)
    : _brand(new char[strlen(brand) + 1]())
    , _price(price)
  {
    strcpy(_brand, brand);
    cout << "Computer(const char *, double)" << endl;
  }

//系统提供的 已经不能满足需求
  #if 0
  Computer(const Computer & rhs)
    : _brand(rhs._brand)//浅拷贝, 只传地址
    , _price(rhs._price)
  {
    cout << "Computer(const Computer&)" << endl;
  }
  #endif
  Computer(const Computer & rhs)
    : _brand(new char[strlen(rhs._brand) + 1]())
    , _price(rhs._price)
  {
    strcpy(_brand, rhs._brand);
    cout << "Computer(const Computer&)" << endl;
  }

  void print()
  {
    printf(" brand = %p\n", _brand);
    cout << " brand:" << _brand << endl
      << " price:" << _price << endl;
  }

  ~Computer()
  {
    delete [] _brand;
    cout << "~Computer()" << endl;
  }

private:
  char * _brand;
  double _price;
};

void test0()
{
  Computer pc1("MateBook", 6666);
  cout << ">> pc1: " << endl;
  pc1.print();

  //用一个已经存在的对象初始化另一个新对象
  Computer pc2 = pc1;
  cout << ">> pc2: " << endl;
  pc2.print();
}

C++内敛函数,构造函数,析构函数,浅拷贝的更多相关文章

  1. C++ 类 & 对象-类成员函数-类访问修饰符-C++ 友元函数-构造函数 & 析构函数-C++ 拷贝构造函数

    C++ 类成员函数 成员函数可以定义在类定义内部,或者单独使用范围解析运算符 :: 来定义. 需要强调一点,在 :: 运算符之前必须使用类名.调用成员函数是在对象上使用点运算符(.),这样它就能操作与 ...

  2. CPP_类默认函数:构造函数,拷贝构造函数,赋值函数和析构函数

    类默认函数:构造函数,拷贝构造函数,赋值函数和析构函数 // person.h #ifndef _PERSON_H_ #define _PERSON_H_ class Person{ public : ...

  3. C++中为什么构造函数不能是虚函数,析构函数是虚函数

    一, 什么是虚函数? 简单地说,那些被virtual关键字修饰的成员函数,就是虚函数.虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离:用形象的语 ...

  4. C++反汇编第一讲,认识构造函数,析构函数,以及成员函数

    C++反汇编第一讲,认识构造函数,析构函数,以及成员函数 以前说过在C系列下的汇编,怎么认识函数.那么现在是C++了,隐含有构造和析构函数 一丶认识构造函数 高级代码: class MyTest { ...

  5. C++(1)C++类四个默认函数---构造函数、析构函数、拷贝函数、赋值函数

    C++构造函数和析构函数 默认构造函数指不带参数或者所有参数都有缺省值的构造函数!!! (1)构造函数.析构函数与赋值函数 构造函数.析构函数与赋值函数是每个类最基本的函数.它们太普通以致让人容易麻痹 ...

  6. 【C++札记】拷贝构造函数,浅拷贝和深拷贝

    一:拷贝构造函数 拷贝构造函数是一种特殊的构造函数,遵循如下的规则: 1.函数名和类名一致,没有返回值. 2.必须有一个参数,参数是本类型的一个引用变量. 3.拷贝构造函数可以访问参数对象的任意成员( ...

  7. C++初阶(类的访问权限以及封装+this指针+构造函数+析构函数+拷贝构造函数+参数列表+友元+内部类)

    面向过程与面向对象 C语言是面向过程的,关注的是过程(函数),分析出求解问题的步骤,通过函数调用逐步解决问题. C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成. ...

  8. C++构造函数/析构函数 设置成private的原因

    C++构造函数/析构函数 设置成private的原因 标签(空格分隔): c/c++ 将构造函数,析构函数声明为私有和保护的,那么对象如何创建? 已经不能从外部调用构造函数了,但是对象必须被构造,应该 ...

  9. C++中new和delete的背后( call edx 调用虚表内的第二个函数(析构函数))

    关于 C++中new背后的行为, 以前已经写过一篇了 理解C++中new背后的行为, 但是里面也只是泛泛而谈,没有真凭实据, 下面我们从汇编的角度看C++编译器究竟在背后干了什么?   我们的代码很简 ...

  10. c++中拷贝构造函数,浅拷贝和深拷贝的区别

    在C++提供了一种特殊的构造函数,称为拷贝构造函数.拷贝构造函数具有一般构造函数的所有特性,其作用是使用一个已经存在的对象(由拷贝构造函数的参数指定的对象)去初始化一个新的同类对象,即完成本类对象的复 ...

随机推荐

  1. SpringBoot Windows 自启动 - 通过 Windows Service 服务实现

    SpringBoot 在Windows运行时,有个黑窗体,容易被不小心选中或关闭,或者服务器重启后,不能自动运行,注册为 Windows Service服务 可实现 SpringBoot 项目在Win ...

  2. 简单入门echart方法

    图表用echart, 然后前端的 HTML 跟 nodejs  , nodejs 去调用 后端PHP的接口 链接:https://www.jianshu.com/p/1f2c37c5c02f 官网:h ...

  3. SpringBoot高频面试题

    Springboot的优点 内置servlet容器,不需要在服务器部署 tomcat.只需要将项目打成 jar 包,使用 java -jar xxx.jar一键式启动项目 SpringBoot提供了s ...

  4. ArcGIS JS API加载带参数的rest服务参数被截掉问题处理

    我们在做一些项目的时候,会对ArcGIS的图层服务进行转发,增加一些权限参数以保证数据访问的安全, 但使用ArcGIS JS API加载的时候,对于rest服务?后增加的参数会被截掉. 为解决这个问题 ...

  5. 看我如何用定值 Cookie 实现反爬

    摘要:本次案例,用定值Cookie实现反爬. 本文分享自华为云社区<我是怎么用一个特殊Cookie,限制住别人的爬虫的>,作者: 梦想橡皮擦 . Cookie 生成 由于本案例需要用到一个 ...

  6. 垃圾回收之G1收集过程

    G1 中提供了 Young GC.Mixed GC 两种垃圾回收模式,这两种垃圾回收模式,都是 Stop The World(STW) 的. G1 没有 fullGC 概念,需要 fullGC 时,调 ...

  7. 人工智能 deepface 换脸技术 学习

    介绍 Deepface是一个轻量级的python人脸识别和人脸属性分析(年龄.性别.情感和种族)框架.它是一种混合人脸识别框架缠绕状态的最先进的模型:VGG-Face,Google FaceNet,O ...

  8. [云计算&大数据]概念辨析:数据仓库 | 数据湖 | 数据中心 | 数据中台 | 数据平台 【待续】

    今日客户对这些个概念不清楚,让我解释解释. 说实在的,虽然对各概念都有印象和理解,但我也不能完完全全地辨析得很清晰. 作为从业者,还是有必要拎清一点. 让一切业务数据化,一切数据业务化. 业务数据化 ...

  9. 从ajax到跨域引发的相关面试题总结

    转载请注明出处: 1.ajax异步和同步的区别 Ajax是一种基于JavaScript语言和XMLHttpRequest对象的异步数据传输技术,通过它可以使不用刷新整个页面的情况下,对页面进行部分更新 ...

  10. ABPvNext-微服务框架基础入门

    ABPvNext-微服务框架基础入门 本文使用的是ABPvNext商业版 最新稳定版本7.0.2为演示基础的,后续如果更新,会单独写一篇最新版本的,此文为零基础入门教程,后续相关代码会同步更新到git ...