C++内敛函数,构造函数,析构函数,浅拷贝

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();
}

原文地址:https://www.cnblogs.com/Davirain/p/11770257.html

时间: 2024-10-02 16:21:19

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

虚函数-构造函数-析构函数

在C++里面,虚函数的作用就是  实现 多态 构造函数可以是  虚函数,但是这样做没有多大意义,特别是在有继承关系的时候估计就不行了,没有继承关系的时候,这个类就不会被创建,编译应该是没有问题的, 析构函数 在有继承的时候,经常用虚函数,因为在  子类有实例的时候,如果让父亲的指针指向  子类的实例,而子类的实例中有new了新的地址空间,那么调用父亲的析构函数,如果父亲的析构函数不是虚的,那么只负责把父亲自己的指针回收,但是子类中new就没有回收:而如果析构函数是虚函数,那么首先是释放子类申请的

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

类默认函数:构造函数,拷贝构造函数,赋值函数和析构函数 class Person{ public : Person():age(10), name(NULL); Person(int myage, char *myname); Person(const Person &a); ~Person(void); void set_age(int myage); void get_age(void); void set_other_age(Person &a, int b); private: i

为什么构造函数不能声明为虚函数,析构函数可以

构造函数不能声明为虚函数,析构函数可以声明为虚函数,而且有时是必须声明为虚函数.不建议在构造函数和析构函数里面调用虚函数. 构造函数不能声明为虚函数的原因是:1 构造一个对象的时候,必须知道对象的实际类型,而虚函数行为是在运行期间确定实际类型的.而在构造一个对象时,由于对象还未构造成功.编译器无法知道对象 的实际类型,是该类本身,还是该类的一个派生类,或是更深层次的派生类.无法确定... 2 虚函数的执行依赖于虚函数表.而虚函数表在构造函数中进行初始化工作,即初始化vptr,让他指向正确的虚函数

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

一, 什么是虚函数? 简单地说,那些被virtual关键字修饰的成员函数,就是虚函数.虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离:用形象的语言来解释就是实现以共同的方法,但因个体差异而采用不同的策略. 所谓虚函数就是多态情况下只执行一个,而从继承的概念来讲,总是要先构造父类对象,然后才能是子类对象,如果构造函数设为虚函数,那么当你在构造父类的构造函数时就不得不显示的调用构造,还有一个原因就是为了防错,试想如果你在子类中一不小心重写了个跟

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

C++反汇编第一讲,认识构造函数,析构函数,以及成员函数 以前说过在C系列下的汇编,怎么认识函数.那么现在是C++了,隐含有构造和析构函数 一丶认识构造函数 高级代码: class MyTest { public: MyTest(); ~MyTest(); public: DWORD m_dwTest; }; MyTest::MyTest() { printf("1111\r\n"); //构造的时候先打印 } MyTest::~MyTest() { printf("2222

C\C++ vector 构造函数 &amp; 析构函数

#include <iostream> #include <vector> using namespace std; class Obj { public: Obj(void){cout<<"Obj(void)"<<" "<<countOne<<endl;countOne++;} Obj(int x){cout<<"Obj(int x)"<<"

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

关于 C++中new背后的行为, 以前已经写过一篇了 理解C++中new背后的行为, 但是里面也只是泛泛而谈,没有真凭实据, 下面我们从汇编的角度看C++编译器究竟在背后干了什么? 我们的代码很简单, 如下: #include <iostream> class A { public: virtual void print() { std::cout << 10; } virtual ~A() { std::cout << "~A()"; } }; c

内敛函数宏定义差别

内敛函数(inline函数) 内敛函数一般规模较小,程序再调用这些成员函数时.不是真正的运行函数的调用过程(如保存返回地址等处理).而是把函数代码嵌入程序的调用点(内敛函数在源文件里不是调用而是按原样展开),这样能够大大降低调用成员函数的时间. 类内定义的成员函数默认是内敛函数.由于在c++中一般将类定义放在头文件里.因此这些类内定义的函数也伴随着写入头文件里.函数声明一般在头文件里.而定义是不同意在头文件里的,由于他们要多次被编译. 若是内敛函数,则同意写在头文件里. 内敛函数的定义: 内联函

内敛函数宏定义区别

内敛函数(inline函数) 内敛函数一般规模较小,程序再调用这些成员函数时,不是真正的执行函数的调用过程(如保存返回地址等处理),而是把函数代码嵌入程序的调用点(内敛函数在源文件中不是调用而是按原样展开),这样可以大大减少调用成员函数的时间. 类内定义的成员函数默认是内敛函数.因为在c++中一般将类定义放在头文件中,因此这些类内定义的函数也伴随着写入头文件中.函数声明一般在头文件中,而定义是不允许在头文件中的,因为他们要多次被编译.若是内敛函数,则允许写在头文件中. 内敛函数的定义: 内联函数