13周的C++课程转眼就学完了5周,C++的标准基本上已经覆盖到了。再加上coding了上百行,总算是对C++有了一个基本的了解。接下来的学习会是关于STL的,所以在此对目前所学做一个小的总结。

  the devil is in the detail, 这是我最大最大的体会。由其是对于这种称之为标准的内容而言。更是如此。

1、赋值,引用,指针

  这三个概念是很多编程语言里面共有的,为了实现c++的高效率,这3板斧更是被发挥的淋漓尽致。总结一下,可以分为两种情况:【传】【返回】。

  【传】赋值的意思就是对变量进行复制  fun(int a), fun(5)。 matlab 里全部都是这样的调用,matlab 并不能传引用。这样做的好处是函数不会修改传入值,坏处是需要对传入的参数进行复制,如果参数很大(e10的点云),那么复制会有很大开销。

  【传】引用的意思是将变量的引用传入,比如 fun(int & a) , int b; fun(b)。这样的做法可以在函数中改变b的值。好处是直接传了地址,不需要复制开销,坏处是不利于变量保护。

  【传】指针和传引用类似,一般情况下,指针是一种很丑的参数,但是有的时候又不得不以指针作为参数。比如点云,往往点云的规模是动态的,内存也是动态分配的,所以很多点云处理函数的参数都是PointCloud<PointXYZ>::ptr,传指针是会改变指针所指向的内容的。

  【返回】值的意思是函数返回一个值,往往是 a = fun(b),被返回的值只能做右值。

  【返回】引用的意思是返回一个变量,这个变量可以有值,也可以未被初始化。它是可以作为左值的,比如 a.getobj() = createobj(A). 或者 ostream & operator <<(ostream & o){return o;  } cout<<MY_OBJ<<endl;

  【返回】指针,返回一个指针也是无奈之举,比如输入的是一个点云,返回它的分割子集。

  总而言之,返回引用多半是为了做左值,返回指多半是因为有开销上的顾虑。

2、const 与数据保护

  const 有三种用法,分别是和数结合,和指针结合,和函数结合。

  【和数结合】和数结合的情况非常单纯,意思就是这个变量不能改了。 int c, const int a =5; const int & b = c; 这样的情况下a = 1, b= 1都会报错,如果想要b = 1,可以令c = 1;

  【和指针结合】和指针结合的情况有点点复杂,分两种 const int * p = & c; 表示常int,这是意思是c的值不能通过p 来修改,和上面的常引用是一样的意思!! int const *p = & c 则表示常*p,意思就是p不能指向其他数据。

  【和函数结合】和函数结合要更复杂那么一点点。分两种情况,fun(const int & a),表示a 不能被修改。fun(int a) const{},const 修饰{}——常成员函数,表示成员函数不允许修改成员变量。常对象只能调用这种常成员函数。

3、构造与析构

  构造与析构是面向对象的路子。主要是构造函数有一点复杂,分缺省构造,普通构造,拷贝构造。

  【缺省构造】如果我们不写构造函数,那么会自动生成缺省构造函数。但是一旦写了,那么就没有缺省构造函数了。如果你想要没参数的构造函数,要么用缺省值伪装,要么自己写上 myclass(){}。建议后者,有时候不记得搞了缺省值会出事的。

  【普通构造】构造函数的作用是初始化成员变量,如果成员变量是私有的,那很可能只有这么一次机会初始化。

  【拷贝构造】拷贝构造是最啰嗦的,它有两种调用形式:1、myclass b ;  myclass a(b); 2、myclass a = b。 第二种看似用了操作符 = ,实际不是的,它调了拷贝构造函数,而不是操作符重载。如果你重载了=,最好别有二义性。

  【析构函数】析构函数最重要的是,如果用new 申请了变量,那么一定要在析构函数里delete []。当然,如果用boost 的 智能指针,可以不用手动释放。

4、操作符重载

  操作符重载还是比较好理解的,记好一个细节,左值要返回引用。

5、继承

  继承是 is 的操作,如果一个类继承了其夫类,那么子类的对象,在内存里会有父类的所有成员变量!并且自动获得父类所有的成员函数。不过获得的成员函数只能操作内存里父类的那些成员变量了。

  设计继承最重要的是子类必须获得父类所有的性质。如果父类有一个行为是子类不需要的,那么就算设计的不好了。

  子类中比较有难度的是构造函数的设计,因为要对内存里父类的那些成员变量赋值,所以其构造函数要写成如下:son(int a,int b,int c):father(a,b),c_(c){}。直接用父类的类名,来完成成员变量的赋值。一个简单的继承例子如下:

 #include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std; class MyString:public string
{
public:
MyString(const MyString & s):string(s){};
MyString(const string & s):string(s){};
MyString(const char * s):string(s){};
MyString(){}; MyString operator()(int start_index,int length){ MyString substr = this->substr(start_index,length);
return substr; } ~MyString(){};
}; int CompareString( const void * e1, const void * e2) {
MyString * s1 = (MyString * ) e1;
MyString * s2 = (MyString * ) e2;
if( *s1 < *s2 ) return -;
else if( *s1 == *s2 ) return ;
else if( *s1 > *s2 ) return ;
} int main() {
MyString s1("abcd-"),s2,s3("efgh-"),s4(s1);
MyString SArray[] = {"big","me","about","take"};
cout << "1. " << s1 << s2 << s3<< s4<< endl;
s4 = s3; s3 = s1 + s3;
cout << "2. " << s1 << endl;
cout << "3. " << s2 << endl;
cout << "4. " << s3 << endl;
cout << "5. " << s4 << endl;
cout << "6. " << s1[] << endl;
s2 = s1; s1 = "ijkl-";
s1[] = 'A' ;
cout << "7. " << s2 << endl;
cout << "8. " << s1 << endl;
s1 += "mnop";
cout << "9. " << s1 << endl;
s4 = "qrst-" + s2;
cout << "10. " << s4 << endl;
s1 = s2 + s4 + " uvw " + "xyz";
cout << "11. " << s1 << endl;
qsort(SArray,,sizeof(MyString), CompareString);
for( int i = ;i < ;++i )
cout << SArray[i] << endl;
//输出s1从下标0开始长度为4的子串
cout << s1(,) << endl;
//输出s1从下标为5开始长度为10的子串
cout << s1(,) << endl;
return ;
}

  这里,MyString 虽然没说,但是获得了string所有的操作符重载(=,+....)还有所有的函数(substr)。唯一需要好好设计的就是构造函数。

  

C++学习 —— 住着魔鬼的细节的更多相关文章

  1. 你应当如何学习C++以及编程(细节是必要的,但不是重要的,把时间用在集中精力去解决问题,而不是学习新技术,那样练不成高手。在实践中提高才是最重要的。最最重要的内功还是长期学习所磨练出来的自学能力)good

    最近在学习Qt但由于没有C++的基础,感觉学的很吃力.看到pongba的这篇文章感觉不错就弄过来了, 原文地址:http://blog.csdn.net/qter_wd007/article/deta ...

  2. 魔鬼在细节,理解Java并发底层之AQS实现

    jdk的JUC包(java.util.concurrent)提供大量Java并发工具提供使用,基本由Doug Lea编写,很多地方值得学习和借鉴,是进阶升级必经之路 本文从JUC包中常用的对象锁.并发 ...

  3. SpringBoot的学习【3.HelloWorld配置细节】

    /** * @SpringBootApplication用来标注主程序类. */ @SpringBootApplication public class First { public static v ...

  4. 学习vue容易忽视的细节

    1.对于自定义标签名(组件名称),Vue.js 不强制要求遵循 W3C 规则 (小写,并且包含一个短杠),尽管遵循这个规则比较好.HTML 特性是不区分大小写的.所以,当使用的不是字符串模板,came ...

  5. Google之Chromium浏览器源码学习——base公共通用库(一)

    Google的优秀C++开源项目繁多,其中的Chromium浏览器项目可以说是很具有代表性的,此外还包括其第三开发开源库或是自己的优秀开源库,可以根据需要抽取自己感兴趣的部分.在研究.学习该项目前的时 ...

  6. 吴恩达-coursera-机器学习-week3

    六.逻辑回归(Logistic Regression) 6.1 分类问题 6.2 假说表示 6.3 判定边界 6.4 代价函数 6.5 简化的成本函数和梯度下降 6.6 高级优化 6.7 多类别分类: ...

  7. 第2季:从官方例程深度学习海思SDK及API

    2.1.官方mppsample的总体分析2.1.sample的整体架构(1)sample其实是很多个例程,所以有很多个main(2)每一个例程面向一个典型应用,common是通用性主体函数,我们只分析 ...

  8. 201671010140. 2016-2017-2 《Java程序设计》java学习第四周

    java学习第四周体会         本周,与前几周不同的是,老师没有进行课堂测试,而是上了一节课,回顾与总结了之前三周所学的知识,也是因为这节课,我注意到了之前学习中忽略的一些细节,和之前学习方法 ...

  9. 2018百度之星开发者大赛-paddlepaddle学习

    前言 本次比赛赛题是进行人流密度的估计,因为之前看过很多人体姿态估计和目标检测的论文,隐约感觉到可以用到这次比赛上来,所以趁着现在时间比较多,赶紧报名参加了一下比赛,比赛规定用paddlepaddle ...

随机推荐

  1. react-native 集成极光推送jpush-react-native时的小问题

    android的一个报错 ... set canOverrideExistingModule=true 解决: 问题是在/android/app/src/java/.../MainApplicatio ...

  2. JS_高程1.javascript简介

    1.javaScript诞生于1995年,最开始是为了处理以前由服务器端语言负责的一些诸如验证的操作. 2.一些名词: ECMA:European Computer Manufacturers Ass ...

  3. GMA Round 1 新年祝福

    传送门 新年祝福 15个人聚集在一起,新年到来,他们每个人写下了一句新年祝福.大家把祝福收集起来,然后重新分回去.如果一个人拿到了自己写的祝福,他就会觉得很没有意思,因为得不到别人的祝福.要避免这种尴 ...

  4. poj1064 Cable master(二分查找,精度)

    https://vjudge.net/problem/POJ-1064 二分就相当于不停地折半试. C++AC,G++WA不知为何,有人说C函数ans那里爆int了,改了之后也没什么用. #inclu ...

  5. shiro-过滤器

    http://shiro.apache.org/authorization.html#Authorization-PermissionGranularity shiro默认的过滤器 Shiro内置了很 ...

  6. SpringBoot(十三):springboot2.0.2定时任务

    使用定义任务: 第一步:启用定时任务第二步:配置定时器资源等第三步:定义定时任务并指定触发规则 1)启动类启用定时任务 在springboot入口类上添加注解@EnableScheduling即可. ...

  7. TensorFlow实战Google深度学习框架8-9章学习笔记

    目录 第8章 循环神经网络 第9章 自然语言处理 第8章 循环神经网络 循环神经网络的主要用途是处理和预测序列数据.循环神经网络的来源就是为了刻画一个序列当前的输出与之前信息的关系.也就是说,循环神经 ...

  8. 每天一个linux命令(6):cp

    1.命令简介 cp(Copy file):将源文件复制至目标文件,或将多个源文件复制至目标目录. 2.用法 cp [选项]... [-T] 源文件 目标文件 或:cp [选项]... 源文件... 目 ...

  9. SharePonit online 列表表单定制

    1)在O365管理中心,确保启用了站点脚本定制,否则,网站不允许将页面切换到编辑模式. 2)Ribbon上,列表->表单web部件->编辑窗体 如果没有Ribbon,则到列表高级设置,启用 ...

  10. 【C++】C++中的函数

    目录结构: contents structure [-] 简介 可变形参的函数 initializer_list形参 省略符形参 main函数处理命令行选项 函数指针与函数引用 inline内联函数 ...