C++语言-02-函数
普通函数
C++是在C语言的基础上增加了面向对象特性的语言,是C语言的超集
- C++中的普通函数与C语言中的普通函数具有类似的性质。请参照以下博客:C语言-04-函数
与类相关的函数
C是一种OOP语言,类是OOP语言的核心,C++中的一部分函数与类相关。
构造函数与拷贝构造函数
- 构造函数
是一种特殊的成员函数,在使用类创建对象时被执行,通常用于在创建对象时为某些成员变量设置初始值。
构造函数的定义规范
- 函数名与类名相同
- 不返回任何值
构造函数的种类
- 无参的构造函数
- 有参的构造函数
- 可以使用初始化列表来初始化字段
定义方式
// 无参的构造函数
ClassName() {
// body of the function
}
// 有参的构造函数,使用初始化列表
ClassName(MemberVariableType memberVariable) : variable(memberVariable) {
// body of the function
}
- 拷贝构造函数
是一种特殊的构造函数,在创建对象,使用同一类中之前创建过的对象来初始化新创建的对象
拷贝构造函数被调用的场景
- 使用另一个同类型的对象来初始化新创建的对象
- 赋值对象把它作为参数传递给函数
- 赋值对象,并从函数返回这个对象
注意
- 若没有定义拷贝构造函数,编译器会自动定义一个。但是在一下情形下,必须定义一个拷贝构造函数
- 类中有指针类型的成员变量,并且有动态内存分配
- 若没有定义拷贝构造函数,编译器会自动定义一个。但是在一下情形下,必须定义一个拷贝构造函数
定义方式
ClassName(const ClassName &classInstance) {
variable = classInstance.variable
}
- 构造函数
析构函数
是一种特殊的成员函数,在类的象被销毁时被执行,通常用于在跳出程序前释放资源
析构函数的定义规范
- 函数名与类名相同,需要在函数名前加上波浪号(~)作为前缀
- 不返回任何值,不带有任何参数
定义方式
```
~ClassName() {
// Release the resource of the classInstance
}
```
友元函数
一种定义在类的外部,有权访问类的私有成员和保护成员的函数
定义方式
// 在类内部定义友元函数原型
friend returnType functionName();
// 在类外部定义友元函数的实现,不需要范围解析运算符 ::
returnType functionName() {
body of the function;
}
注意
- 友元函数不是成员函数,不能使用this指针
内联函数
在编译阶段,编译器会将内联函数的代码副本复制到每一个调用该该内联函数的地方,使用inline关键字定义,如下
inline returnType functionName() {
// body of the function
}
内联函数的注意事项
- 类定义中定义的函数,默认都是内俩函数,即使没有使用inline关键字
- 每次修改内联函数,都必须重新编译该函数的所有调用代码(替换函数调用处旧的内联函数副本)
示例
定义Animal类
class Animal {
private:
string name; // 名字
int *age; // 年龄
public:
// set方法
inline void setName(string animalName) {
name = animalName;
}
void setAge(int animalAge) {
*age = animalAge;
}
// 无参的构造函数
Animal() {
cout << "Normal constructor" << endl;
// 为指针分配内存地址
age = new int;
}
// 有参的构造函数
Animal(string animalName, int animalAge) {
cout << "Normal constructor with parameter" << endl;
name = animalName;
// 为指针分配内存地址
age = new int;
*age = animalAge;
}
// 拷贝构造函数
Animal(const Animal &animal) {
cout << "Copy constructor" << endl;
name = animal.name;
// 为指针分配内存地址
age = new int;
*age = *animal.age;
}
// 友元函数
friend void printAnimal(const Animal animal);
// 析构函数
~Animal() {
cout << "Release the resource of the classInstance" << endl;
delete age;
}
};
定义Animal类的友元函数
// 友元函数的定义
void printAnimal(const Animal animal) {
cout << "狗的名字:" << animal.name << " 年龄:" << *animal.age << endl;
}
main()函数
int main(int argc, const char * argv[]) {
// 使用有参的构造函数创建Animal对象
Animal dog1;
dog1.setName("TOBY");
dog1.setAge(5);
// 使用友元函数打印dog1
printAnimal(dog1);
// 使用无参的构造函数创建Animal对象
Animal dog2("MAX", 4);
// 使用友元函数打印dog2
printAnimal(dog2);
// 使用拷贝构造函数创建Animal对象
Animal dog3 = dog2;
printAnimal(dog3);
return 0;
}
C++语言-02-函数的更多相关文章
- C语言02
C语言02 1.2 C语言与C程序 1.计算语言 语言发展 机器语言:机器语言是机器能直接识别的程序语言或指令代码,勿需经过翻译,每一操作码在计算机内部都有相应的电路来完成它,或指不经翻译即可为机器直 ...
- C 语言 时间函数使用技巧(汇总)
time.h 头文件 是 C 语言中 有关 时间的函数所储存的头文件 #include <time.h> 在介绍时间函数用法之前,我们首先要了解在 time.h 头文件中已经声明了的一个结 ...
- C语言pow函数编写
C语言pow函数编写 #include<stdio.h> double chaoba(double f,double q); //声明自定义函数 void main(void) { dou ...
- C语言-自定义函数
C语言自定义函数 --1-- 自定义函数定义 1.1 无参无返回值函数 1.2 无参有返回值函数 1.3 有参无返回值函数 1.4 有参有返回值函数 --2-- 函数的参数 2.1 形式参数介绍和使用 ...
- C语言printf()函数:格式化输出函数
C语言printf()函数:格式化输出函数 头文件:#include <stdio.h> printf()函数是最常用的格式化输出函数,其原型为: int printf( char ...
- C语言的函数
"函数"在英文的翻译是"function",无论在自然科学还是计算机科学都是这个词,而"function"的本意是"功能" ...
- c语言main函数返回值、参数详解(返回值是必须的,0表示正常退出)
C语言Main函数返回值 main函数的返回值,用于说明程序的退出状态.如果返回0,则代表程序正常退出:返回其它数字的含义则由系统决定.通常,返回非零代表程序异常退出. 很多人甚至市面上的一些书籍,都 ...
- Go语言示例-函数返回多个值
Go语言中函数可以返回多个值,这和其它编程语言有很大的不同.对于有其它语言编程经验的人来说,最大的障碍不是学习这个特性,而是很难想到去使用这个特性. 简单如交换两个数值的例子: package mai ...
- 【学习笔记】【C语言】函数
一. 什么是函数 任何一个C语言程序都是由一个或者多个程序段(小程序)构成的,每个程序段都有自己的功能,我们一般称这些程序段为“函数”.所以,你可以说C语言程序是由函数构成的. 比如你用C语言编写了一 ...
- 【转载】 c语言inline函数的使用
c语言inline函数的使用 转载自:http://blog.chinaunix.net/uid-21843265-id-3056446.html 大学在教科书上学习过inline函数,定义为inli ...
随机推荐
- 常用CSS Reset汇总
什么是Css Reset呢? 在 HTML标签在浏览器里有默认的样式,不同浏览器的默认样式之间也会有差别.在切换页面的时候,浏览器的默认样式往往会给我们带来麻烦,影响开发效率.所以解决的方法就是一开始 ...
- 关于VSTO调用Excel后进程无法退出的解决方案:
VSTO的Excel对象模型提供了托管代码对Excel的操作.但是它的实现时通过RCW(Runtime Com Wrapper)实现的,所以无法完全按照托管代码的运行方式操作.COM的资源释放时通过引 ...
- 【分布式】RPC初探
事先声明:本文代码参考自Dubbo作者的博客. RPC(Remote Procedure Call)远程过程调用,是分布式系统当中必不可少的一个玩意.比如说在单机系统当中,我想调用某个方法,直接调就可 ...
- yousa_team团队项目 兼职平台 完成展示
我们团队的团队项目是一个大学生兼职网站,商家可以在网站上发布信息,学生对相应的岗位进行预约,然后根据信誉度来表示用户的信誉,整个平台由管理员监控, 包括修改错误信息,修改用户信誉度,删除过期信息,接受 ...
- Ember Charts – 基于 Ember & D3 的图表库
Ember Charts 是一个基于 Ember.js 和 D3.js 的图表库.它包括时间序列.柱状图.饼图.点图,很容易扩展和修改.这些图表组件代表图表交互性和演示的最佳实践,是高度可定制和可扩展 ...
- LeetCode——LRU Cache
Description: Design and implement a data structure for Least Recently Used (LRU) cache. It should su ...
- [git]通过commit_id找回文件
git checkout commit_id 这样会切换到这个commit_id的上,文件的内容就是这个commit保存的内容. git checkout -b new_branch_name com ...
- Android 学习笔记之Volley(六)实现获取服务器的字符串响应...
学习内容: 1.使用StringRequest实现获取服务器的字符串响应... 前几篇一直都在对服务——响应过程的源码进行分析,解析了整个过程,那么Volley中到底实现了哪些请求才是我们在开发中 ...
- php + Redis 写的类似于新浪微博的feed系统
最近接了一个feed系统的外包,类似于微博那种!客户端是ios和android,服务器用的php,数据库用的是redis.分享下服务器和数据库部分的功能!希望对大家有帮助. 关于redis的介绍,大家 ...
- 前端js的书写规范和高效维护的方案_自我总结使用的方案
作为程序员,人生最值得幸福的事有几件: 解决困扰了很长时间的问题 升职加薪 找个漂亮又靠谱的对象 深得领导的喜欢 带领团队冲锋陷阵 ... 哈哈,这些都是梦想,暂时想想就好了.这肯定和我说的东西不符合 ...