C++面向对象高级编程(一)基础篇
技术在于交流、沟通,转载请注明出处并保持作品的完整性。
概要:
知识点1 构造函数与析构函数
知识点2 参数与返回值
知识点3 const
知识点4 函数重载(要与重写区分开)
知识点5 友元
先以C++的两大经典class(complex 不含指针, string 含指针)之一 complex(复数类) 做例子.
#ifndef complex_hpp //防止头文件重复
#define complex_hpp #include <stdio.h> class complex
{
public:
//知识点1 构造与析构函数(见下文)
complex(double r = 0, double i = 0) : re(r) ,im(i) {}
//知识点2 参数与返回值(见下文)
complex& operator += (const complex& r);
//知识点3 const(见下文)
double real() const { return re; }
double imag() const { return im; }
//知识点4 函数重载(见下文)
void real(double r); private:
double re,im;
//知识点5 友元(见下文)
friend complex& __doapl (complex*, const complex&);
};
//知识点6 内联(见下文)
inline complex&__doapl (complex* ths, const complex& r)
{
ths->re += r.re;
ths->im += r.im;
return *ths;
} #endif /* complex_hpp */
知识点1 构造函数与析构函数
a. 构造函数不可以直接调用,他是有我们创建之后自动调用的函数
b.上面我写的是带初省值的构造函数(就是带红色:),则你不可以再声明不带参数而带有出省值的构造函数
complex () : re() , im() {} //如果你在声明这样的构造函数 会报错.因为下面的两个初始化 编译器会识别不出该调用哪个
complex c1;
complex c2();
c.如果将构造函数与析构函数声明private权限下,则外界不可以随便创建该对象,应用实例单例设计模式(这个我会在C++设计模式的文章中做详细介绍)
d.可用下面三种方式创建对象
complex c2;//默认构建 栈
complex c1(,);//初始值构建 栈
complex* p = new complex();//动态构建 堆
e.析构函数,不可以直接调用,对象销毁时自动调用,不带指针的类多半可以不用写析构函数
f.对象的创建有两个过程 1.初始化,2.赋值,所以带出省值的构造函数(给成员变量赋值)比 不该出省值的构造函数内部赋值 创建对象更有效率
知识点2 参数与返回值
参数 : 参数传递的三种形式 pass by value(将整包东西穿过去,效率低) , pass by pointer(传递指针), pass by reference(传递引用,类似指针,建议使用)
a.介绍一下引用,引用相当于取别名,必须初始化,之后不能再引用其他变量,不能引用null
b.传递引用效率高,且比传递指针更加漂亮,传递引用4字节(你可能会说传递char 1字节,比引用快,具体情况具体分析嘛)
void func_int(int a); //pass by value
void func_char(char* i);//pass by point
void func()_class(const complex&);//pass by reference
返回值 : 三种形式同参数,效率任然是by reference更高,但是要注意,不要返回局部对象的引用
错误实例
int& func()
{
int a = ;
return a; //函数调用结束后,局部变量a将销毁,返回局部变量引用无意义
}
知识点3 const
先介绍一下const的作用,使"其"不能变.
a.const声明普通变量, 即常量,必须初始化
const int a = ;
b.const声明指针
const int* p1;//不能改变其指向的数据
int const *p2;//同上
int* const p3;//不能改变其指向
c.const声明成员变量,常量成员,需要在构造函数中初始化
d.const声明函数
//在class中
const void func(); //不能调用非const成员函数
像complex中函real()的const
double real() const { return re; }//可以理解成常量成员函数 const member functions 不可以改变变量 只能get 不能set //如果你不声明const的话 const complex c1(,); cout << c1.real(); //会报错 --- 因为c1是const变量 该函数可能修改其变量
要大胆的使用const,会给你带来无限的好处.
知识点4 函数重载(要与重写区分开)
a.不同的函数可以具有相同的函数名,前提是形参列表不同(参数个数不同,参数类型不同)
b.不能通过返回值得类型不同进行函数重载
知识点5 友元
a.frend声明的函数 优点:实现类之间数据共享时,减少系统开销,提高效率 . 缺点 友元函数破环了封装机制
b.同一个class的各个object 互为 friend (友元)
complex c1(,);
complex c2; //c1与c2互为友元
c.高效率
friend complex& __doapl (complex*, const complex&); //可以直接使用其私有成员变量 效率会高于其他函数如"set()"函数
知识点6 内联
a.inline内联函数,效率高,即使你将函数声明称inline也可能内联不成功,内联函数实现控制在5行内.
效率与推荐
a. 带出省值的构造函数
b. return/pass by reference
c. 友元
d. 内联
e. move() //我在格式工厂(四)中有介绍
如有不正确的地方请指正
参照<<侯捷 C++面向对象高级编程>>
C++面向对象高级编程(一)基础篇的更多相关文章
- C++面向对象高级编程(四)基础篇
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 一.Static 二.模板类和模板函数 三.namespace 一.Static 静态成员是“类级别”的,也就是它和类的地位等同,而普通成员是“ ...
- C++面向对象高级编程(三)基础篇
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 概要 一.拷贝构造 二.拷贝赋值 三.重写操作符 四.生命周期 本节主要介绍 Big Three 即析构函数,拷贝构造函数,赋值拷贝函数,前面主 ...
- C++面向对象高级编程(二)基础篇
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 概要 知识点1.重载成员函数 知识点2 . return by value, return by reference 知识点3 重载非成员函数 ...
- C++面向对象高级编程(八)模板
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 这节课主要讲模板的使用,之前我们谈到过函数模板与类模板 (C++面向对象高级编程(四)基础篇)这里不再说明 1.成员模板 成员模板:参数为tem ...
- 夯实Java基础系列1:Java面向对象三大特性(基础篇)
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 [https://github.com/h2pl/Java-Tutorial](https: ...
- C++面向对象高级编程(九)Reference与重载operator new和operator delete
摘要: 技术在于交流.沟通,转载请注明出处并保持作品的完整性. 一 Reference 引用:之前提及过,他的主要作用就是取别名,与指针很相似,实现也是基于指针. 1.引用必须有初值,且不能引用nul ...
- C++面向对象高级编程(七)point-like classes和function-like classes
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 1.pointer-like class 类设计成指针那样,可以当做指针来用,指针有两个常用操作符(*和->),所以我们必须重载这两个操作 ...
- C++面向对象高级编程(六)转换函数与non-explicit one argument ctor
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 1.conversion function 转换函数 //1.转换函数 //conversion function //只要你认为合理 你可以任 ...
- C++面向对象高级编程(五)类与类之间的关系
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 本节主要介绍一下类与类之间的关系,也就是面向对象编程先介绍两个术语 Object Oriented Programming OOP面向对象编 ...
随机推荐
- asp.net操作GridView添删改查的两种方法 及 光棒效果
这部份小内容很想写下来了,因为是基础中的基础,但是近来用的比较少,又温习了一篇,发现有点陌生了,所以,还是写一下吧. 方法一:使用Gridview本身自带的事件处理,代码如下(注意:每次操作完都得重新 ...
- pxe无人值守自动安装
rpm -ivh http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpmyum listyum upda ...
- 20145327实验三 敏捷开发与XP实践
敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 程序缩进: 结对git的应用 PSP 步骤 耗时 百分比 需求分析 15m 12.5% 设计 30m 25% 代码实现 45m 37.5 ...
- NOIP2015 T4 推销员 贪心+堆优化
前几天在学堆,这个数据结构貌似挺简单的,但是我看了很久啊QAQ... 今天算是搞懂了吧...于是想到了这道题...(当初悄悄咪咪看题解记得一点) 点我看题 放洛谷的题... 题意的话,大概就是有n个房 ...
- Dropping water balloons (入门dp)
2017-08-12 18:36:24 writer:pprp 最近刚刚接触动态规划,感觉状态的查找和转移自己很难想到,都是面向题解编程,但是一开始都是这样了,只有相信我可以独立自己解决动态规划这类问 ...
- java如何实现Socket的长连接和短连接
讨论Socket必讨论长连接和短连接 一.长连接和短连接的概念 1.长连接与短连接的概念:前者是整个通讯过程,客户端和服务端只用一个Socket对象,长期保持Socket的连接:后者是每次请求,都新建 ...
- php入门(二)
PHP字符串变量: 1.PHP strlen() 函数 <?php $str1="abcd"; $str2="efgh"; $str=$str1.$str ...
- spring mvc:内部资源视图解析器2(注解实现)@Controller/@RequestMapping
spring mvc:内部资源视图解析器2(注解实现) @Controller/@RequestMapping 访问地址: http://localhost:8080/guga2/hello/goo ...
- python 爬虫005-爬虫实例
实例一:扒取猫眼电影TOP100 的信息 #!/usr/bin/env python # -*- coding: utf-8 -*- """ 扒取猫眼电影TOP100 的 ...
- HDU - 59562016ACM/ICPC亚洲区沈阳站I - The Elder 树上斜率优化dp
题意:给定上一棵树,然后每条边有一个权值,然后每个点到 1 的距离有两种,第一种是直接回到1,花费是 dist(1, i)^2,还有另一种是先到另一个点 j,然后两从 j 向1走,当然 j 也可以再向 ...