技术在于交流、沟通,转载请注明出处并保持作品的完整性。

概要:

知识点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++面向对象高级编程(一)基础篇的更多相关文章

  1. C++面向对象高级编程(四)基础篇

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 一.Static 二.模板类和模板函数 三.namespace 一.Static 静态成员是“类级别”的,也就是它和类的地位等同,而普通成员是“ ...

  2. C++面向对象高级编程(三)基础篇

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 概要 一.拷贝构造 二.拷贝赋值 三.重写操作符 四.生命周期 本节主要介绍 Big Three 即析构函数,拷贝构造函数,赋值拷贝函数,前面主 ...

  3. C++面向对象高级编程(二)基础篇

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 概要 知识点1.重载成员函数 知识点2 . return by value, return by reference 知识点3 重载非成员函数 ...

  4. C++面向对象高级编程(八)模板

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 这节课主要讲模板的使用,之前我们谈到过函数模板与类模板 (C++面向对象高级编程(四)基础篇)这里不再说明 1.成员模板 成员模板:参数为tem ...

  5. 夯实Java基础系列1:Java面向对象三大特性(基础篇)

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 [https://github.com/h2pl/Java-Tutorial](https: ...

  6. C++面向对象高级编程(九)Reference与重载operator new和operator delete

    摘要: 技术在于交流.沟通,转载请注明出处并保持作品的完整性. 一 Reference 引用:之前提及过,他的主要作用就是取别名,与指针很相似,实现也是基于指针. 1.引用必须有初值,且不能引用nul ...

  7. C++面向对象高级编程(七)point-like classes和function-like classes

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 1.pointer-like class 类设计成指针那样,可以当做指针来用,指针有两个常用操作符(*和->),所以我们必须重载这两个操作 ...

  8. C++面向对象高级编程(六)转换函数与non-explicit one argument ctor

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 1.conversion function 转换函数 //1.转换函数 //conversion function //只要你认为合理 你可以任 ...

  9. C++面向对象高级编程(五)类与类之间的关系

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 本节主要介绍一下类与类之间的关系,也就是面向对象编程先介绍两个术语 Object Oriented Programming   OOP面向对象编 ...

随机推荐

  1. ABP官方文档翻译 2.4 日志

    日志 服务端 获取记录器 基类日志记录器 配置 Abp.Castle.Log4Net包 客户端 服务端 ABP使用Castle Windsor`s 日志设备.它可以使用不同的日志类库:Log4Net, ...

  2. centos6.7安装lamp

    1.配置防火墙,开启80端口.3306端口 vi /etc/sysconfig/iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport ...

  3. 编写和运行简单的"Hello World"操作系统内核

    通常编写一个操作系统内核是一项浩大的工程.但我今天的目标是制作一个简单的内核,用比较方便的方法在虚拟机上验证它能够被grub装载和运行,并且可通过gdb进行调试,为接下去的工作创造一个基础环境. 首先 ...

  4. JS的Scope

    关键字:域(scope),闭包(closure),关键字this,命名空间(namespace),函数域(function scope),全局域(global scope),词法作用域(lexical ...

  5. 彻底搞懂hashCode与equals的作用与区别及应当注意的细节

    以前写程序一直没有注意hashCode的作用,一般都是覆盖了equals,缺没有覆盖hashCode,现在发现这是埋下了很多潜在的Bug!今天就来说一说hashCode和equals的作用. 先来试想 ...

  6. pyspider—爬取视频链接

    #!/usr/bin/env python # -*- encoding: utf-8 -*- # Created on 2015-03-20 09:46:20 # Project: fly_spid ...

  7. POJ 1144 Network(无向图的割顶和桥模板题)

    http://poj.org/problem?id=1144 题意: 给出图,求割点数. 思路: 关于无向图的割顶和桥,这篇博客写的挺不错,有不懂的可以去看一下http://blog.csdn.net ...

  8. java 资源文件夹下的MEAT-INF

    META-INF文件夹是干啥的,META-INF文件夹的作用, META-INF文件夹能删吗 https://www.cnblogs.com/demingblog/p/5653844.html Jar ...

  9. poj 2229 Sumsets 完全背包求方案总数

    Sumsets Description Farmer John commanded his cows to search for different sets of numbers that sum ...

  10. Java循环语句之 do...while

    do...while 循环与 while 循环语法有些类似,但执行过程差别比较大. 语法: 执行过程: <1>. 先执行一遍循环操作,然后判断循环条件是否成立 <2>. 如果条 ...