当前位置:   article > 正文

第二章 基本语言_获得用户输入的一个合法算式例如1.2+3.4输出运算结果

获得用户输入的一个合法算式例如1.2+3.4输出运算结果

第一节 语言特性 、工程构成、可移植性

 

语言特性:过程式、对象式的程序设计

a. 面向过程的程序设计(过程式的程序设计:c语言程序设计):从上往下,逐步求精,按顺序一步一步把问题解决

结构:学生:学号,名字,性别,成绩

在c语言中,要用结构的话,需要定义一个数与该结构的变量                 

 

b. 基于对象的程序设计 和 面向对象的程序设计

在C++中,把结构叫成‘类’,如果要使用类,这里就不叫定义结构变量,而是叫做定义一个对象;在类中除了可以定义成员变量还可以定义一些成员函数。这种功能包含在类中,需要的时候通过定义一个对象的方式来调用程序。这种程序书写的方式,就叫做基于对象的程序设计方法。

C++语言有下面特性:

继承性(类的继承)

多态性(父类和子类同名函数的调用) 

以上特性升华了基于对象的程序设计,叫面向对象的程序设计

面向对象程序设计的优点:

易维护

易扩展

模块化:通过设计各种访问级别,来限制别人对类的访问,也保护了数据的安全。

可移植性

不同系统可以移植源代码,但是不能移植二进制文件。

 

第二节 命名空间简介、基本输入输出精解

 

命名空间概念简介

如果在同一个project里面有两个cpp文件写了一个同名函数,那么在编译的时候后面的文件会报错,因为命名冲突了。命名空间就是为了防止名字冲突而引入的一种机制。系统中可以定义多个命名空间,每个命名空间都有自己的名字,不可以同名。可以把命名空间看做一个作用域,在一个命名空间里面定义函数,跟另外一个命名空间里定义的函数,即便同名,也不影响。

(1)命名空间的定义

namespace():命名空间名

{

......

}

(2)命名空间名的定义可以不连续,甚至可以写在多个文件钟。如果以往没有命名这个空间,那么“namespace命名空间名”这种写法就相当于定义了一个命名空间,如果以往已经定义了一个空命名空间,那么“namespace命名空间名”这种写法就相当于打开已经存在的命名空间并为其添加新成员的声明

(3)外界访问某个命名空间中的函数(假如定义了 radius()函数)

格式:命名空间::实体名

或者在代码行最前面使用 “using namespace 命名空间”,这样就可以直接使用radius()函数了。

基本输入输出cin cout精解

输入输出流

 

第三节  auto、头文件防卫、引用、常量

(1)局部变量及初始化

随时用到 随时定义

比较少见的定义变量的方式

int a{5};

int a[] {11,12,34};

(2) auto:变量的自动类型推断

auto可以在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型;(声明的时候要赋予初值[初始化])

auto自动类型推断发生在编译期间。所以使用auto不会造成程序效率降低

  1. auto value=true;//bool
  2. auto ch='a';//char

(3)头文件的防卫式声明

头文件1声明了一个全局变量g_globalh1,头文件2声明了一个全局变量g_globalh2,并且include头文件1,在源代码里面i同时nclude头文件1和头文件2时就会出现变量g_globalh1的重定义。为了解决这个问题,需要在两个头文件中分别写上如下代码:

  1. #ifndef __HEAD1__H__
  2. #define __HEAD1__H__
  3. int g_globalh1=8;
  4. #endif;
  1. #ifndef __HEAD2__H__
  2. #define __HEAD2__H__
  3. #include "head.h"
  4. int g_globalh2=10;
  5. #endif;

当 __HEAD1__H__没有被定义过的时候执行下面的代码块,定义g_globalh1,当第二次执行的时候,__HEAD1__H__已经被定义过了,所以后面的代码不再执行。

(4)引用

引用理解成:为变量起了另外一个名字,一般用&符号表示。起完别名后,这个别名和变量本身就看成同一个变量,定义引用时必须初始化,而且两个变量的类型要相同。引用作为函数参数,会改变实参的值。

  1. int value=10;
  2. int &refval=value;

 (5)常量

const int var=7;\\一种承诺,表示不会去改变这个变量

constexpr  int var=1;\\C++11引入,在编译的时候求值

(int &)var   表示将var的引用强制转化为整型

 

第四节 范围for、new内存动态分配、nullptr

   (1) 范围for语句:用于遍历一个序列

  1. int v[]={12,13,14,16,18}
  2. //for(auto x:v)数组v中的每个元素,依次拷贝x中并打印x值
  3. for(auto &x,v)
  4. {
  5. cout<<x<<endl;
  6. }

(2) 动态内存分配问题:

 

 

(3)nullptr

 

 

结论:对于指针的初始化都用nullptr。

第五节 结构、权限修饰符、类简介

  1. struct student
  2. {
  3. int number;
  4. char name[100];
  5. }
  6. void func1(student tmpstu)//形参用结构变量(不可改变原来的结构体变量)
  7. void func2(student &tmpstu)//形参变成了引用(可改变原来的结构体变量)
  8. void func3(student *ptmpstu)//用结构体的指针做函数参数(可改变原来的结构体变量)

public和private权限修饰符:

a.C++结构内部的成员变量以及成员函数,默认的访问级别都是public,而c++类内部的成员变量以及成员函数默认的访问级别都是private。

b. C++结构体的继承默认是public,而C++类的继承默认都是private

 

类的组织,书写规范:

类的定义代码会放在一个.h的头文件中,头文件可以跟类名相同,student.h

类的具体实现代码,放在一个.cpp文件中,student.cpp

 

 

第五节 函数新特性、内联函数、const详解

  1. inline int myfunc(int testv)//函数定义前加Inline,这个普通函数就变成了内联函数
  2. {
  3. return 1;
  4. }

函数体很小,调用很频繁的函数。

       inline影响编译器,在编译阶段对inline这种函数进行处理,系统尝试将调用该函数的动作替换为函数本意,通过这种方式,提升性能。但是这只是开发者对编译器的定义,具体还要编译器进行决定。内联函数的定义就要放在头文件中,方便找到函数本体的源码,并尝试将函数的调用替换为函数体内的语句。

缺点:代码膨胀问题,所以内联函数函数体要尽可能小

注意:循环,分支,递归尽量不要出现在inline函数中,否则的话,系统可能拒绝让这个函数成为内联函数。

 

三:函数杂合用法总结

(1)函数返回类型为void,表示函数不返回任何类型。但是我们可以调用一个但会类型是void的函数,让他作为另一个返回类型是void的函数

(2)函数返回指针和返回引用的情况

  1. int *myfunc()
  2. {
  3. int tmpvalue=9;
  4. return &tmpvalue;//这不可以,因为函数执行完毕之后,tmpvalue这段内存被系统回收,不能再使用
  5. }
  6. int &mytunc()
  7. {
  8. int tmpvalue=9;
  9. return tmpvalue;//也是同样的问题
  10. }

(3)没有形参可以保持形参列表为空(),或者int myfunc(void)

  (4) 如果一个函数我们不调用的话,该函数可以只有声明部分,没有定义部分。

(5)普通函数的定义一般在cpp文件中,只能定义一次,定义在头文件中,一般定义函数的cpp文件会#include自己的函数定义头文件。声明可以声明多次。

(6)void func(int &a,int&b),在c++中,更习惯用引用类型的形参来取代指针类型的形参,多使用引用类型的形参。

  (7)C++中,函数允许同名,但是形参列表的参数类型或者数量应该有明显的区别。

五:函数形参中带const

把形参写成const的形式有很多好处

(1)可以防止无意中修改了形参值导致实参值被无意修改。

  (2)实参类型可以更加灵活。

 

第六节 string类型介绍

定义和初始化string对象:

  1. string s1://默认初始化,s1=“”,空串
  2. string s2="I Love China!"//拷贝字符串到S2代表的内存中,但是不包括末尾的‘\0
  3. string s3=s2//把s2的内容拷贝到s3的内存中
  4. string s4(I Love China!")和s2的初始化等同
  5. int num=6;
  6. string s5(num,'a');//s5="aaaaaa"

string对象上的操作:

empty()判断是否为空,返回的布尔值

size()/length():返回字节/字符的数量 代表该字符串的长度。unsigned int

s[n]:返回s中的第n个字符,n表示的是一个位置,位置从0开始,到.size()-1;

下标n超过这个范围,会产生不可预料的结果。

s1+s2;字符串的连接,返回连接后的结果,其实就是一个新的string对象

s1=s2;字符串的复制,用s2的内容代替原来s1里面的内容

s1==s2;判断两个字符串是否相等,大小写敏感。

 

读写string对象:

cin和cout

字面值和string相加:

  1. 字面值和string相加
  2. string s1=“abc”;
  3. string s2=“defg”;
  4. string s3=s1+and+s2+‘e’;
  5. cont<<s3<<endl;
  6. //string s5="abc"+"def";语法上不允许
  7. //string s5=“abc”+ s1+ "def; 中间夹一个string对象,语法上允许。
  8. //string s5=“abc”+“def”+s2;错误,两个常字符串不能直接相加

 

 

 

 第七节 类型转换 static_cast、reinterpret_cast等

 

 

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/621501
推荐阅读
相关标签
  

闽ICP备14008679号