一、第一个C++程序
 1、文件扩展名
  C++源代码的文件扩展名.cpp、C、cxx、c(需要指定编译语言)
  自定义的头文件依然保留.h
 2、头文件
  C++标准库的头文件不带.h,最常用的是iostream
  C语言中的头文件依然可以继续使用,stdio.h或cstdio
 3、输入输出
  cout<<输出
  cin>>输入
  endl换行
  cout和cin不再使用占位符,它可以自动识别数据类型。
  scanf和printf可以继续使用。
 4、编译器
  gcc也可以编译C++的源码,但需要添加额外的参数
  g++是编译C++源码的最简单的编译器,一般操作没有默认安装。
  ubuntu系统的安装指令:sudo apt-get install g++
  之前的gcc的编译参数,依然可以继续使用。
  注意:C++编译时的错误提示不是很精准,一个错误可能会产生大量的错误提示。
 5、引入了名字空间概念
  using namespace std;
二、C++中的基本数据类型
 1、C++完全兼容C语言中的所有数据类型(C++兼容C语言的所有语法。)。
 2、添加了bool类型、字节宽度1,数值true(非零值),false(零值)。
 3、在显示bool变量前,使用boolalpha可以以true或flase的形式显示bool值。
 4、void* 与其它类型指针的转换受到限制
  void* 不可以直接给其它类型的指针赋值,必须经过强制转换。
  任意类型的指针都可以直接给void*赋值。
三、C++中的联合、枚举、结构
 1、在C++中联合、枚举、结构设计成功后,再使用不需要加关键字。
 2、枚举的检查更为严格(C++中的枚举是一种独立的数据类型)。
 3、结构成员中可以有函数,在函数中可以直接访问结构的成员。
 4、结构对象可以继续使用.或->访问成员、成员函数。
 5、结构中的成员添加了访问属性:
  public:开放的,被它修饰过的成员在任何位置都可以访问
  private:私有的,被它修饰过的成员只能在成员函数中使用
  protected:以后再说。
 6、结构在创建时会自动调用一个函数-构造函数。
  a、无返回值
  b、名字与结构相同
  c、参数可以任意
 7、结构在释放时会自动调用一个函数-析构函数。
  a、无返回值、参数
  b、~结构名
  
 练习:C++的走迷宫。
四、引用
 1、引用就起"外号",为一个标识符另外再取一个名字。
 2、引用必需初始化,否则编译错误。
 3、引用不光可以引用标识符,也可以引用立即数(右值、字面值、常量),但必须加const属性。
 4、不能定义空引用,但"野引用"或"悬空引用"是存在的(引用了堆内存的数据,当堆内存释放后就不应该再使用)。
 5、引用只能是一次性的,无法再更改(引用一旦成功后,它是个变量了这个身份至死不渝)。
 6、引用可以当作函数的参数,它引用的对象就是函数的实参,所以引用可以达到指针的效果。
  a、函数之间共享变量
  b、提高参数的传递效率(比指针还要高)
  c、可以获取参数
  注意:能使用引用就不要再使用指针了。
  引用能否完全取代指针,不可以。
 7、引用也可以当作函数的返回值,但绝不能返回局部变量的引用。
 练习1:使用引用定义一个可以交换两人个变量值的函数。
 练习2:定义一个函数,计算两个整数的最大公约数和最小公倍数,最大公约数使用返回值返回,最小公倍数使用引用返回。
五、C++中的内存管理运算符
 1、在C++中使用 new/delete 来管理内存,new用来申请内存,delete用来释放内存。
 2、new在内存时允许对内存进行初始化。
 3、使用new创建结构对象时会自动调用构造函数,delete时会自动调用析构函数。
 总结:malloc/free与new/delete的区别?
  1、malloc/free标准库的函数,使用时还需要添加头文件,而new/delete是C++语言中的运算符。
  2、malloc返回值的是void*指针,new返回的是有类型的指针。
  3、malloc创建对象时不会调用构造函数,free时不会调用析构函数,但new/delete会自动调用构造和析构函数。
  4、使用malloc使用内存时需要自己计算字节数,而使用new的时候会自动计算。
 4、[]可以配合new和delete申请或释放数组。
  new[]与不可以与delete混用,必须使用delete[]释放。
  使用new[]/delete[]创建多少个对象就会调用多次构造和析构。
 5、new/delete与malloc/free不能混用。
 6、delete不可以重复释放,但可以释放空指针。
 7、如果使用new申请内存失败会抛出异常"std::bad_alloc",异常的捕获和处理会在以后讲解。
六、C++中的函数
 1、C++中函数可以在main前执行,C语言中不可以。
 2、C++中的函数名可以相同,只要参数不同即可(函数重载,不只是参数)。
  函数可以同名并不是真正意义上的同名,它只在编译基本把函数的名字添加了额外信息(函数的参数),返回值不算内。
 3、内联函数
  内联函数就是把函数编译成二进制,然后在需要的位置直接把函数拷贝过去,而不是跳转后再执行,这样可以减少进栈、出栈、和调用,以此提高程序的执行效率,但这样会增加可执行文件的大小。
  内联函数与宏函数的区别:从本质上来说它们是一样的,但内联函数可以检查参数,也可以具有返回值。
 inline 返回值 函数名(参数)
 {
 }
 4、C++中函数的参数可以有默认值
  1、函数的默认参数要靠右。
  2、默认参数要尽量要少用,因为可能会引用重载错误。
  3、默认参数是编译器在编译时帮助赋值的,所以只能由全局变量、静态变量、字面值对参数进行赋值。
  

一、名字空间
 C语言中的名字空间的划分:全局、局部、块
 C++认为:全局空间用起非常方便,但如果把太多的东西放在全局空间会造成命名冲突,所以C++引用了这样一种机制就是名字空间。
 名字空间:把全局的命名空间进一步分割,可以创建出一个个独立的命名空间防止相互之间冲突。

  1. 、定义名字空间:
  2. namespace name
  3. {
  4. 变量;
  5. 函数;
  6. 结构、类;
  7. }
  8. 、名字空间的合并
  9. a、同名的名字空间会自动合并。
  10. b、在同一个名字空间中只标识符必须是唯一的。
  11.  
  12. 、定义与声明分开
  13. namespace n1
  14. {
  15. //在名字空间中声明函数
  16. void func(void);
  17. }
  18. // 在名字空间外定义函数
  19. void n1::func(void)
  20. {
  21. }
  22. 、如何使用名字空间中的内容
  23. a、域限定符(::),直接使用,名字空间::标识符,这样的好处是绝对不会冲突,但就是麻烦了些。
  24. busing namespace 名字空间; 功能是把名字空间中的标识符对之后的代码全部公开。
  25. cusing 名字空间::标识符,表示此标识符对后面的代码公开。
  26. 、名字空间的嵌套
  27. 名字空间可以嵌套,但使用时要逐层解析。
  28. namespace n1
  29. {
  30. int num = ;
  31. namespace n2
  32. {
  33. int num = ;
  34. namespace n3
  35. {
  36. int num = ;
  37. }
  38. }
  39. }
  40. n1::n2::n3::num ==
  41. n1::n2::num == ;
  42. n1::num = ;
  43. using namespace n1::n2;
 6、全局空间归属为匿名空间
  在全局空间定义的标识符都属于这个匿名空间,匿名空间默认开放。
  如果函数中有同名的标识符把匿名空间中的屏蔽了,可以使用空的域限定符表示它。
 注意:不同命名空间中的同名函数不构成重载,同一作用域下的同名函数叫重载。
 
二、class
 1、C++的class与struct一样,是一种复合数据类型。
 2、里面可以有变量用来表达属性,函数用来表示行为。
 3、在C++的class与struct,几乎没有任何区别。
 4、struct中默认访问属于是public,class中默认的访问属性是private。
 5、在C++默认使用class,以示与C语言中的class进行区分。
 
练习:定义一个Date类: year,month,day,在类里提供
 1、年月日是否有效,返回bool类型
 2、是否是闰年,返回bool类型
 3、求nextday() ,返回下一天的日期
  4、写一个nextday(int n)表示n表后的日期,注意n可正可负
 
 1、日期转换成天数
 2、由天数转换成日期
三、class的构造函数
 1、在创建对象时自动调用的函数,在整个对象的生命周期中一定会被调用一次,且只能被调用一次。
 2、在构造函数中负责对成员变量的初始化、分配资源、设置对象的初始状态。
 3、构造函数可以有多个版本,这些不同的版本之间会构造重载,创建对象时的方式不同、给的参数不同会调用相应的构造函数,如果调用的构造函数不存在可能会造成编译错误。
  // 无参构造
  Student stu <=> Student* stup = new Student;
  Student stu(参数列表) <=> Student* stup = new Student(参数列表);
 4、如果类中没有定义构造函数,编译器会自动生成一个无参构造。
  一旦定义了其它版本的构造函数,无参构造就不会再生成了,因此为了防止无参方式创建对象出错,在定构造函数时,至少要实现两个。
 5、无参构造未必无参,在C++中函数可以有默认参数,如果有参构造全部设置了默认参数,就会和无参数构造有冲突,它们两个只能有一个存在。
 6、所谓的"编译器生成的某某函数"
  "编译器生成的某某函数",不是真正意义上的函数,编译作为指令的生成者,只要生成具有某些函数功能的指令即,没有必须生成高级语言的主义上的函数。
 7、什么时候调用无参构造
  a、Student stu <=> Student* stup = new Student;
  b、创建对象数组,每个对象都会调用一次无参构造。
  c、如果类A中有成员是类B,当执行守类A的构造函数前会自动调用类B的无参构造。
  d、在类A中如何调用类B的有参构造
  类A(参数列表):成员类B(参数列表)
  {
   ...
  }   
 8、类型转换构造函数
  用一个数据给对象初始化,默认会自动调用构造函数,达到类型转换的效果。
  这种方式虽然使用方便,但也会包容一些错误存在,如果想让代码检查更为严格可以使用explicit关键字禁止隐式转换的方式调用构造函数。
 9、也可以实现自动类型转换构造函数(默认)。
练习:
1、写一个Date类,有属性:年、月、日,实现其各种构造函数。
2、写一个Timer类(属性定义为私有,方法定义为公开)
     有一个属性 unsigned int second;//second记录定时器的秒数
     有一个属性 Action action;//定时器响应动作
     typedef bool (*Action)(void *);
     有一个方法setAction(Action a),当调用begin()方法之后,second秒之后自动调用a函数。
3、使用class方式实现五子棋。
 

 
  

C++ 入门随手笔记及联系的更多相关文章

  1. C#入门随手笔记

    1..Net Framework是Microsoft为开发应用程序而创建的一个开发平台. 运行操作系统不限:Microsoft版本运行在windows,Mono版本运行开Linux和MacOS: 应用 ...

  2. Hadoop入门学习笔记---part4

    紧接着<Hadoop入门学习笔记---part3>中的继续了解如何用java在程序中操作HDFS. 众所周知,对文件的操作无非是创建,查看,下载,删除.下面我们就开始应用java程序进行操 ...

  3. Hadoop入门学习笔记---part3

    2015年元旦,好好学习,天天向上.良好的开端是成功的一半,任何学习都不能中断,只有坚持才会出结果.继续学习Hadoop.冰冻三尺,非一日之寒! 经过Hadoop的伪分布集群环境的搭建,基本对Hado ...

  4. PyQt4入门学习笔记(三)

    # PyQt4入门学习笔记(三) PyQt4内的布局 布局方式是我们控制我们的GUI页面内各个控件的排放位置的.我们可以通过两种基本方式来控制: 1.绝对位置 2.layout类 绝对位置 这种方式要 ...

  5. PyQt4入门学习笔记(一)

    PyQt4入门学习笔记(一) 一直没有找到什么好的pyqt4的教程,偶然在google上搜到一篇不错的入门文档,翻译过来,留以后再复习. 原始链接如下: http://zetcode.com/gui/ ...

  6. Hadoop入门学习笔记---part2

    在<Hadoop入门学习笔记---part1>中感觉自己虽然总结的比较详细,但是始终感觉有点凌乱.不够系统化,不够简洁.经过自己的推敲和总结,现在在此处概括性的总结一下,认为在准备搭建ha ...

  7. JS SDK 随手笔记

    JS SDK 随手笔记 窗口模块 Frame/Multi Frame 对话框 页面间的通讯 生命周期 窗口层叠 窗口模块 窗口模块是是AppCan移动应用界面最基本的单位.窗口是每个界面布局的基础,他 ...

  8. Nginx快速入门菜鸟笔记

    Nginx快速入门-菜鸟笔记   1.编译安装nginx 编译安装nginx 必须先安装pcre库. (1)uname -a 确定环境 Linux localhost.localdomain 2.6. ...

  9. 第三章 Git的入门 - 读书笔记

    Android驱动月考3 第三章 Git的入门 - 读书笔记 对于Github,这是全世界最大的开源平台,你可以把你做的项目在这里开源,把你发现的一些新技术在这里开源,向全世界的开发者们分享,大家都彼 ...

随机推荐

  1. 可视化的Redis数据库管理工具redis-desktop-manager的初步使用(图文详解)

    不多说,直接上干货! 无论是Linux 还是 Windows里安装Redis, Windows里如何正确安装Redis以服务运行(博主推荐)(图文详解) Windows下如何正确下载并安装可视化的Re ...

  2. 关于作用域范围Scope

    举个例子,如下: public class C { public int a = 2; public void test(int b) { int c = 3; for (int d = 3; a & ...

  3. centos7-安装mysql5.6.36

    本地安装了mysql5.7, 但和springboot整合jpa时会出现 hibernateException, 不知道为什么, 换个mysql5.6版本的mysql,  源码安装, cmake一直过 ...

  4. Date类学习总结(Calendar Date 字符串 相互转换 格式化)

    Date类学习总结 1.计算某一月份的最大天数 Calendar time=Calendar.getInstance();time.clear();time.set(Calendar.YEAR,yea ...

  5. 别被官方文档迷惑了!这篇文章帮你详解yarn公平调度

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由@edwinhzhang发表于云+社区专栏 FairScheduler是yarn常用的调度器,但是仅仅参考官方文档,有很多参数和概念文 ...

  6. Apache POI导出excel

    public String exportXls(HttpServletRequest request, HttpServletResponse response) { try { HSSFWorkbo ...

  7. java Html 转 PDF

    Html 转 PDF 使用 flying-saucer 插件来完成 导入flying-saucer依赖 <dependency> <groupId>org.xhtmlrende ...

  8. input属性type为file打开文件资源管理器时,如何限制多次选取或只能一次选取的行为

    1.input标签没有设置multiple属性,文件资源管理器默认一次选取 <!doctype html> <html lang="en"> <hea ...

  9. ubuntu系统

    Ubuntu 18.04 NVIDIA驱动安装总结:(需要和自己电脑上的显卡配套) https://blog.csdn.net/tjuyanming/article/details/80862290 ...

  10. MySQL填坑系列--Linux平台下MySQL区分大小写问题

    大家好,我是软件大盗(道),下面开始我们的<MySQL填坑系列>. 笔者最近又在MySQL的边缘试探,然后,试探着,试探着就报错了. 书接上文,系统连接数据库时报错:找不到DB_TIMIN ...