C++_语言概览和资料

C++

C语言1969年-1973年完成,其出发点是为了编写Unix操作系统
设计目标
     需求、背景和待解决问题
	 演化过程中,来自用户的反馈和语言实现者们积累的经验
设计哲学: 高效原则
     C语言是为了速度而不是为了舒适而创建的,为了追求高效的编译代码,对程序员没有提出过多的限制,给与了更多的自由
	 作为底层语言维持着对底层硬件的直接访问功能,同时作为一种复杂的高级语言提供高层抽象能力
	 让C++既具有适合于系统程序设计的C语言所具有的可适应性和高效性,又能在其程序组织结构方面具有像Simula那样的语言设施
	 只有在迈向库的道路真正走不通的情况下,才应该踏上语言扩充之路
语言特性:
	 

C存在问题:
      C语言的声明语法就实在远不及优美;而其内建型别的隐式转换规则也是混乱无章法的
      C++多用于开发各种后台使用的算法和逻辑库。
      而C语言则更底层,主要用于开发更核心的算法、驱动程序和控制程序等
	  
	  
	  算法和数据结构、面向对象思想、基本语言知识、产品开发、与其他语言混合开发


但C++门槛依然很高,尤其
     C++的内存问题(内存泄露,内存溢出,内存宕机,堆栈破坏等问题),
      需要理解C++标准对象模型,C++标准库,标准C库,操作系统等内存设计,
     才能更加深入理解C++内存管理,这是跨越C++三座大山之一

根本原因: 面向对象编程+ 高性能

绊脚石
   模板-C++模板看成是一种新的语言,而且可以看成是函数式编程语言,只是设计依附在(借助于)C++其他基础语法上
    视觉复杂性
     
     template<typename T>class X{...};
      template<typename T>retType function_name(T t);

C语言

C语言在IT工业中的根基地位-清轻重,有的放矢
设计哲学-满足和相信程序员-特种兵
  C语言一直在演进,从未停下过脚步,时至今日,C语言的流行度仍然非常高。
  工业级编程语言
  具有紧凑、高效、移植性好、对内存的精细控制等优秀特性
  语法简单-C有32个关键字(C89标准-小内核、大外延的编程语言-C标准库非常小
  相似的编程逻辑与构建过程---静态编译型语言
     编程逻辑-----变量和函数都要先声明后才能使用-
	 构建(build) --源码需要先编译链接才能运行
     所有分配的内存块都要有对应的类型信息,并且再确定其类型信息后才能操作
	 依赖管理-- C语言的世界中,我们依然要靠外部工具(比如CMake)来管理第三方的依赖
  错误处理机制-基于错误值比较的错误处理机制,让每个开发人员必须显式地去关注和处理每个错	 


    一方面,C语言提供了几乎所有可以帮助程序员表达自己意图的语法手段,
         比如宏、指针与指针运算、位操作、pragma指示符、goto语句,以及跳转能力更为强大的longjmp等;
    另一方面,C语言对程序员的行为并没有做特别严格的限定与约束,
        C程序员可以利用语言提供的这些语法手段,
        进行天马行空的发挥:访问硬件、利用指针访问内存中的任一字节、操控任意字节中的每个位(bit)等。

C语言中,内存管理这些都是程序员的责任,靠近机器-对内存以及一些低级操作的精确控制
   因为一旦有了GC,程序员就远离了机器,程序员直面机器的需求就无法得到满足了
旷野中更多自由,但周围也暗藏着很多未曾遇到过的危险			

C++与Go

  C++0x(就是现在众所周知的 C++11)	
   如果说C++ 和 Java 是关于类型继承和类型分类的,Go 就是关于组合的
  
   Go程序员拥抱C语言简明指南 https://tonybai.com/2022/05/16/the-short-guide-of-embracing-c-lang-for-gopher/

C++与Java

C++和java之间的异同

  ###库和依赖
    C++的库相对复杂些。存在动态链接库的概念,而且在不同的操作系统上的格式不同
	C++中的函数可以在别的文件中声明,声明与定义分开,C++中的一个文件调用定义在另一个文件中的函数时,需要先声明函数才能通过编译。
    
    Java的库比较简单,由于bytecode都是在运行时动态导入的,
      所以不存在“动态库”(dynamic linked library)的说法。静态库(static library)则只有一种,即包含bytecode的jar文件
	  Java中的函数声明和定义都在一起,而且Java里任何东西都是类,所以函数只能属于类而不能单独存在。
	  
   ###依赖:
    Java使用package作为命名空间,与文件系统的路径相对应,.java文件的名字必须与其中的类同名,且一个.java文件只能定义一个类。
	   使用URL的倒序作为package名字来唯一地识别命名空间  
    
    C++的情况更复杂,允许在一个.cpp文件中定义多个命名空间 -namespace	

###常量
     Java使用final关键字来定义常量。
     C++有两种方式,可以用const关键字定义,也可以用#define 预处理器定义
	判断
      Java允许用String做Switch的条件,C++不允许必须用strcmp()函数解决。	

###C++指针
     三种智能指针 unique_ptr, shared_ptr, weak_ptr,都是STL里面的模板类(泛型类)
    Java中没有inline类似的关键字,内联优化是在运行时由JVM自动完成的
	
###面向对象
     C++中定义成员函数,除了可以像Java那样直接定义在类内,还可以在类内声明,类外定义。	
	 Java和C++为所有的类默认创建一个无参构造函数。但C++中如果手动创建了有参构造函数,没有创建无参的,则编译器不会自动创建无参。
	 C++默认给每一个类自动定义,相当于Java里Object类里的clone()。定义好后就可以对此类的两个对象a和b做赋值操作: a=b
	 初始化列表(Initialization List) C++独有语法,用来初始化类的data membe
	 Java中的this和super是引用,指向对象自己以及父类的对象。
        C++因为多重继承的问题,没有super关键字。this是指针,不是引用。一个类的所有成员函数(不包括友元函数)都可以使用this指针
		C++独有:静态data member不能直接定义在类中,只能声明,在类外还要重新声明和初始化
	C++使用:表示继承,Java使用extends关键字
	C++中的STL相当于Java中的java.util.Collection和java.util.Map包,包含了容器模板类(泛型类),相应的算法,和迭代器(Iterator)
	C++使用std::thread类来创建线程,将线程执行的函数的指针传给thread的构造函数
	Java实现线程有三种方式:继承java.lang.Thread类,实现java.lang.Runnable接口,实现java.util.concurrent.Callable接口
        Java容器类包含List、ArrayList、Vector及map、HashTable、HashMap、Hashset
		Java容器类包含List、ArrayList、Vector及map、HashTable、HashMap、Hashset
		   vector

###应用层面
    c++关注点是解决一个个技术点,实现某项功能

C++ resource

   Stephen Prata《C++ Primer Plus 》 c++第一个编译器的作者 
   Stanley B.Lippman 《Essential C++ 》
   Bjarne Stroustrup 《The C++ Programming Language》
   Bjarne Stroustrup 《The design and Evolution of C++ 》;https://www.doc88.com/p-99459428791611.html 
   Scott Meyers 大师Effective三部曲: Effective C++、 More Effective C++、 Effective STL
   More C++ Idioms:wikipedia.org https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms
   C++ Standard Library Tutorial and Reference
   https://en.cppreference.com/w/
   https://cplusplus.com/
GitHub - Light-City/CPlusPlusThings: C++那些事 https://github.com/Light-City/CPlusPlusThings
posted @ 2023-01-11 11:12  辰令  阅读(121)  评论(0编辑  收藏  举报