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();
}
C++内敛函数,构造函数,析构函数,浅拷贝的更多相关文章
- C++ 类 & 对象-类成员函数-类访问修饰符-C++ 友元函数-构造函数 & 析构函数-C++ 拷贝构造函数
C++ 类成员函数 成员函数可以定义在类定义内部,或者单独使用范围解析运算符 :: 来定义. 需要强调一点,在 :: 运算符之前必须使用类名.调用成员函数是在对象上使用点运算符(.),这样它就能操作与 ...
- CPP_类默认函数:构造函数,拷贝构造函数,赋值函数和析构函数
类默认函数:构造函数,拷贝构造函数,赋值函数和析构函数 // person.h #ifndef _PERSON_H_ #define _PERSON_H_ class Person{ public : ...
- C++中为什么构造函数不能是虚函数,析构函数是虚函数
一, 什么是虚函数? 简单地说,那些被virtual关键字修饰的成员函数,就是虚函数.虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离:用形象的语 ...
- C++反汇编第一讲,认识构造函数,析构函数,以及成员函数
C++反汇编第一讲,认识构造函数,析构函数,以及成员函数 以前说过在C系列下的汇编,怎么认识函数.那么现在是C++了,隐含有构造和析构函数 一丶认识构造函数 高级代码: class MyTest { ...
- C++(1)C++类四个默认函数---构造函数、析构函数、拷贝函数、赋值函数
C++构造函数和析构函数 默认构造函数指不带参数或者所有参数都有缺省值的构造函数!!! (1)构造函数.析构函数与赋值函数 构造函数.析构函数与赋值函数是每个类最基本的函数.它们太普通以致让人容易麻痹 ...
- 【C++札记】拷贝构造函数,浅拷贝和深拷贝
一:拷贝构造函数 拷贝构造函数是一种特殊的构造函数,遵循如下的规则: 1.函数名和类名一致,没有返回值. 2.必须有一个参数,参数是本类型的一个引用变量. 3.拷贝构造函数可以访问参数对象的任意成员( ...
- C++初阶(类的访问权限以及封装+this指针+构造函数+析构函数+拷贝构造函数+参数列表+友元+内部类)
面向过程与面向对象 C语言是面向过程的,关注的是过程(函数),分析出求解问题的步骤,通过函数调用逐步解决问题. C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成. ...
- C++构造函数/析构函数 设置成private的原因
C++构造函数/析构函数 设置成private的原因 标签(空格分隔): c/c++ 将构造函数,析构函数声明为私有和保护的,那么对象如何创建? 已经不能从外部调用构造函数了,但是对象必须被构造,应该 ...
- C++中new和delete的背后( call edx 调用虚表内的第二个函数(析构函数))
关于 C++中new背后的行为, 以前已经写过一篇了 理解C++中new背后的行为, 但是里面也只是泛泛而谈,没有真凭实据, 下面我们从汇编的角度看C++编译器究竟在背后干了什么? 我们的代码很简 ...
- c++中拷贝构造函数,浅拷贝和深拷贝的区别
在C++提供了一种特殊的构造函数,称为拷贝构造函数.拷贝构造函数具有一般构造函数的所有特性,其作用是使用一个已经存在的对象(由拷贝构造函数的参数指定的对象)去初始化一个新的同类对象,即完成本类对象的复 ...
随机推荐
- How to implement UDP protocal
Server implementation Open a socket on the server that listens to the UDP requests. (I've chosen 888 ...
- flak_login用法
基础的信息和全局配置这里就不多说,需要用到再斟酌也可以的.这里也是针对每个模块较为常用的进行解释说明,后期再使用过程中遇到会进行补充. Login_Manager LoginManager是一个类,有 ...
- pandas之合并操作
Pandas 提供的 merge() 函数能够进行高效的合并操作,这与 SQL 关系型数据库的 MERGE 用法非常相似.从字面意思上不难理解,merge 翻译为"合并",指的是将 ...
- PySimpleGU之运行多个窗口
这是PySimpleGUI继续简单的地方,但是问题空间刚刚进入了"复杂"领域. 如果您希望在事件循环中运行多个窗口,则有两种方法可以执行此操作. 当第二个窗口可见时,第一个窗口不会 ...
- [Git/SVN] Gitee使用教程
1 Gitee Gitee 提供免费的 Git 仓库,还集成了代码质量检测.项目演示等功能. 对于团队协作开发,Gitee 还提供了项目管理.代码托管.文档管理的服务,5 人以下小团队免费. CASE ...
- 一道名题-(csp 儒略日)的心得与技巧
引: 如果你见到一个oi对着 4713,1582 146097 2299160 颠颠地笑,不用怀疑,他是在做那道名题--<csp-s2020 T1 儒略日> 这道题,我做了三年,平均每年做 ...
- SMT贴片加工钢网工艺制作方法
smt贴片加工过程中,首先要进行锡膏印刷,而锡膏印刷的工作原理就是用机器刮刀将锡膏推送到钢网的孔洞中,使锡膏与pcb板的电子元器件接触,为下一步焊接做准备.钢网的作用就是与pcb板焊盘位置固定,使锡膏 ...
- Zabbix_sender基础命令浅析
zabbix_sender是Zabbix监控系统中用于向Zabbix服务器发送数据的命令行工具.以下是zabbix_sender基础命令教学: 语法: zabbix_sender -z <ser ...
- 【Spring5】AOP
3 AOP 面向切面编程,利用AOP可以对业务的各个逻辑进行隔离,从而使得业务逻辑各部分的耦合度之间降低,提高程序的可重用性,同时提高开发的效率. 目的:不通过修改源代码,在主干功能上增加新功能 AO ...
- android studio 做登陆界面
先来一个最简单的 AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> &l ...