C++教程(初级,有基础)

C++教程(初级,有基础)

#include <iostream>
using namespace std;
int main()
{	/*对应printf("")*/
    cout << "Hello, world!" << endl;//cout << "Hello, world!" << "\n";
    return 0;
}
  • C++ 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。

  • C++ 被认为是一种中级语言,它综合了高级语言和低级语言的特点。

  • C++ 是 C 的一个超集,任何合法的 C 程序都是合法的 C++ 程序。

  • 面向对象开发的四大特点:封装、抽象、继承、多态

  • 三个重要组成部分

    1. 核心语言:所有结构块
    2. C++标准库
    3. 标准库模板(STL)

基本语法

  • 对象 - 对象具有状态和行为。例如:一只狗的状态 - 颜色、名称、品种,行为 。对象是类的实例。
  • 类 - 类可以定义为描述对象行为/状态的模板/蓝图。
  • 方法 - 从基本上说,一个方法表示一种行为。一个类可以包含多个方法。可以在方法中写入逻辑、操作数据以及执行所有的动作。
  • 即时变量 - 每个对象都有其独特的即时变量。对象的状态是由这些即时变量的值创建的。
#include <iostream>//必要的头文件
using namespace std;//用std命名的空间
// main() 是程序开始执行的地方
int main()
{
   cout << "Hello World"; // 输出 Hello World 对标printf
   return 0;
}

数据类型

type:         ************size**************
bool:         所占字节数:1    最大值:1        最小值:0
char:         所占字节数:1    最大值:        最小值:?
signed char:     所占字节数:1    最大值:        最小值:?
unsigned char:     所占字节数:1    最大值:?        最小值:
wchar_t:     所占字节数:4    最大值:2147483647        最小值:-2147483648
short:         所占字节数:2    最大值:32767        最小值:-32768
int:         所占字节数:4    最大值:2147483647    最小值:-2147483648
unsigned:     所占字节数:4    最大值:4294967295    最小值:0
long:         所占字节数:8    最大值:9223372036854775807    最小值:-9223372036854775808
unsigned long:     所占字节数:8    最大值:18446744073709551615    最小值:0
double:     所占字节数:8    最大值:1.79769e+308    最小值:2.22507e-308
long double:     所占字节数:16    最大值:1.18973e+4932    最小值:3.3621e-4932
float:         所占字节数:4    最大值:3.40282e+38    最小值:1.17549e-38
size_t:     所占字节数:8    最大值:18446744073709551615    最小值:0
string:     所占字节数:24
type:         ************size**************
typedef声明
typedef type newname; 
typedef int feet;//feet 是 int 的另一个名称:
feet distance;//int distance
枚举类型
enum color { red, green=5, blue };//blue=6 red=0
变量声明(extern)
  1. int a 声明,也是定义 需要建立存储空间
  2. extern int a 声明,不是定义 不需要建立存储空间,通过extern声明变量名而不定义它

extern 存储类 全局变量,对所有程序文件都可见,

  1. 对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。
  2. extern 是用来在另一个文件中声明一个全局变量或函数。
左值/右值
  1. 左值lvalue :可以出现在赋值号 左边或右边 int a=0;
  2. 右值rvalue :术语右值,存储在内存中某些地址的数值。只能出现在右边 10=20(报错)

作用域

  1. 在函数或块内部的局部变量 局部和全局同名时用局部保存在
  2. 在所有函数外部的全局变量 保存在静态存储单元
  3. 形式参数的函数参数定义中

常量

比c多一个bool:布尔常量共有两个,它们都是标准的 C++ 关键字:

  • true 值代表真。1
  • false 值代表假。0

存储类

  • auto 默认存储类 修饰局部变量
  • register 存储类 在寄存器中不是在RAM的局部变量,(一个寄存器大小)
  • static 存储类
    1. 在函数调用之间保持局部变量的值,每次调用该函数时,只初始化一次
    2. 用于全局变量,作用域在声明它的文件内
static int a=10;//a是全局变量可直接调用
int main(){
   while(a--){
    fun();}
    return 0;
}
void fun(void){
    static int b=5;//局部变量,值初始化一次为5,后面不会再重置
    b++;
    print("%d,%d",a,b);//%输出""内的内容,
}
9,6
8,7
7,8
    .....
  • extern 存储类 全局变量,对所有程序文件都可见,

    1. 对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。
    2. extern 是用来在另一个文件中声明一个全局变量或函数。
  • mutable存储类

    允许对象的成员替代常量:nutable成员可以通过const成员函数修改

  • thread_local存储类

    仅可在它在其上创建的线程上访问,在创建线程时创建,并在销毁线程时销毁

运算符

  • 算术运算符
  • 关系运算符
  • 逻辑运算符
  • 位运算符
  • 赋值运算符
  • 杂项运算符

循环

判断

函数

return_type function_name( parameter list )
{
   body of the function
}
  • **返回类型:**一个函数可以返回一个值。return_type 是函数返回的值的数据类型。有些函数执行所需的操作而不返回值,在这种情况下,return_type 是关键字 void
  • **函数名称:**这是函数的实际名称。函数名和参数列表一起构成了函数签名。
  • **参数:**参数就像是占位符。当函数被调用时,您向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。
  • **函数主体:**函数主体包含一组定义函数执行任务的语句。

函数参数

传值调用(默认)

把参数的实际值赋值给函数的形式参数。这种情况下,修改函数内的形式参数对实际参数没有影响。

#include <iostream>
using namespace std;
 
// 函数声明
void swap(int x, int y);
// 函数定义
void swap(int x, int y)
{
   int temp;
 
   temp = x; /* 保存 x 的值 */
   x = y;    /* 把 y 赋值给 x */
   y = temp; /* 把 x 赋值给 y */
  
   return;
}
int main ()
{
   // 局部变量声明
   int a = 100;
   int b = 200;
 
   cout << "交换前,a 的值:" << a << endl;
   cout << "交换前,b 的值:" << b << endl;
 
   // 调用函数来交换值
   swap(a, b);
 
   cout << "交换后,a 的值:" << a << endl;
   cout << "交换后,b 的值:" << b << endl;
 
   return 0;
}
交换前,a 的值: 100
交换前,b 的值: 200
交换后,a 的值: 100
交换后,b 的值: 200 

在函数内改变了xy的值,但实际ab没变

指针调用

把参数的地址复制给形式参数,修改形参会记录到参数地址中,再调用该地址,指会变

// 函数定义
void swap(int *x, int *y)
{
   int temp;
   temp = *x;    /* 保存地址 x 的值 */
   *x = *y;        /* 把 y 赋值给 x */
   *y = temp;    /* 把 x 赋值给 y */
  
   return;
}
#include <iostream>
using namespace std;

// 函数声明
void swap(int *x, int *y);

int main ()
{
   // 局部变量声明
   int a = 100;
   int b = 200;
 
   cout << "交换前,a 的值:" << a << endl;
   cout << "交换前,b 的值:" << b << endl;

   /* 调用函数来交换值
    * &a 表示指向 a 的指针,即变量 a 的地址 
    * &b 表示指向 b 的指针,即变量 b 的地址 
    */
   swap(&a, &b);

   cout << "交换后,a 的值:" << a << endl;
   cout << "交换后,b 的值:" << b << endl;
 
   return 0;
}
交换前,a 的值: 100
交换前,b 的值: 200
交换后,a 的值: 200
交换后,b 的值: 100
引用调用

把引用的地址复制给形参,引用用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。

// 函数定义
void swap(int &x, int &y)
{
   int temp;
   temp = x; /* 保存地址 x 的值 */
   x = y;    /* 把 y 赋值给 x */
   y = temp; /* 把 x 赋值给 y  */
  
   return;
}
#include <iostream>
using namespace std;
 
// 函数声明
void swap(int &x, int &y);
 
int main ()
{
   // 局部变量声明
   int a = 100;
   int b = 200;
 
   cout << "交换前,a 的值:" << a << endl;
   cout << "交换前,b 的值:" << b << endl;
 
   /* 调用函数来交换值 */
   swap(a, b);
 
   cout << "交换后,a 的值:" << a << endl;
   cout << "交换后,b 的值:" << b << endl;
 
   return 0;
}
 
// 函数定义
void swap(int &x, int &y)
{
   int temp;
   temp = x; /* 保存地址 x 的值 */
   x = y;    /* 把 y 赋值给 x */
   y = temp; /* 把 x 赋值给 y  */
  
   return;
}
交换前,a 的值: 100
交换前,b 的值: 200
交换后,a 的值: 200
交换后,b 的值: 100

数字

中的函数

序号函数 & 描述
1double cos(double); 该函数返回弧度角(double 型)的余弦。
2double sin(double); 该函数返回弧度角(double 型)的正弦。
3double tan(double); 该函数返回弧度角(double 型)的正切。
4double log(double); 该函数返回参数的自然对数。
5double pow(double, double); 假设第一个参数为 x,第二个参数为 y,则该函数返回 x 的 y 次方。
6double hypot(double, double); 该函数返回两个参数的平方总和的平方根,也就是说,参数为一个直角三角形的两个直角边,函数会返回斜边的长度。
7double sqrt(double); 该函数返回参数的平方根。
8int abs(int); 该函数返回整数的绝对值。
9double fabs(double); 该函数返回任意一个浮点数的绝对值。
10double floor(double); 该函数返回一个小于或等于传入参数的最大整数。
随机数
  1. rand()返回一个伪随机数 生成随机数之前要调用srand()函数
int main ()
{
   int i,j;
 
   // 设置种子
   srand( (unsigned)time( NULL ) );
 
   /* 生成 10 个随机数 */
   for( i = 0; i < 10; i++ )
   {
      // 生成实际的随机数
      j= rand();
      cout <<"随机数: " << j << endl;
   }
 
   return 0;
}

数组

多维数组
type name[size1][size2]...[sizeN];
指向数组的指针
double *p;
double runoobAarray[10];

p = runoobAarray;
*(runoobAarray + 4)//访问 runoobAarray[4] 
传递数组给函数
  • 通过指定不带索引的数组名来传递一个指向数组的指针。

  • C++ 传数组给一个函数,数组类型自动转换为指针类型,因而传的实际是地址。

  • 声明函数形式参数

    1. 形式参数是一个指针:

      void myFunction(int *param)
      {
      .
      .
      .
      }
      
    2. 形式参数是一个已定义大小的数组:

      void myFunction(int param[10])
      {
      .
      .
      .
      }
      
    3. 形式参数是一个未定义大小的数组:

      void myFunction(int param[])
      {
      .
      .
      .
      }
      
从函数返回数组

C++ 不允许返回一个完整的数组作为函数的参数。但是可以通过指定不带索引的数组名来返回一个指向数组的指针。

字符串

C++ 提供了以下两种类型的字符串表示形式:

  • C 风格字符串
  • C++ 引入的 string 类类型
  • 函数
序号函数 & 目的
1strcpy(s1, s2); 复制字符串 s2 到字符串 s1。
2strcat(s1, s2); 连接字符串 s2 到字符串 s1 的末尾。连接字符串也可以用 + 号,例如: string str1 = "runoob"; string str2 = "google"; string str = str1 + str2;
3strlen(s1); 返回字符串 s1 的长度。
4strcmp(s1, s2); 如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回值小于 0;如果 s1>s2 则返回值大于 0。
5strchr(s1, ch); 返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。
6strstr(s1, s2); 返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。

指针

指针是一个变量,其值为另一个变量的地址

type *var-name;

C++ 指针详解

在 C++ 中,有很多指针相关的概念,这些概念都很简单,但是都很重要。下面列出了 C++ 程序员必须清楚的一些与指针相关的重要概念:

概念描述
C++ Null 指针C++ 支持空指针。NULL 指针是一个定义在标准库中的值为零的常量。
C++ 指针的算术运算可以对指针进行四种算术运算:++、–、+、-
C++ 指针 vs 数组指针和数组之间有着密切的关系。
C++ 指针数组可以定义用来存储指针的数组。
C++ 指向指针的指针C++ 允许指向指针的指针。
C++ 传递指针给函数通过引用或地址传递参数,使传递的参数在调用函数中被改变。
C++ 从函数返回指针C++ 允许函数返回指针到局部变量、静态变量和动态内存分配。
Null指针

没有确切的地址时赋Null(为0的常量)

指针的算术运算

ptr++(加一个类型的长度)

ptr–(减一个类型的长度)

指针vs数组

指针指向的地址不能修改地址的值(地址中的值可以修改)

数组中的值可以修改

指针数组
int *ptr[MAX];
指向指针的指针
int **var;//c中有解释
传递指针给函数

传递指针给函数,需要声明函数参数为指针类型。

从函数返回指针

引用

int i = 17;
int&  r = i;
区分指针
  • 不存在空引用。引用必须连接到一块合法的内存。
  • 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
  • 引用必须在创建时被初始化。指针可以在任何时间被初始化。
把引用作为参数

比传参安全

void swap(int& x, int& y);
把引用作为返回值

和返回其他值一样

时间和日期

在头文件中

基本的输入输出

头文件函数和描述
该文件定义了 cin、cout、cerrclog 对象,分别对应于标准输入流、标准输出流、非缓冲标准错误流和缓冲标准错误流。
该文件通过所谓的参数化的流操纵器(比如 setwsetprecision),来声明对执行标准化 I/O 有用的服务。
该文件为用户控制的文件处理声明服务。我们将在文件和流的相关章节讨论它的细节。
/*输出*/
cout << "Value of str is : " << str << endl;
/*输入*/
cin >> name;
/*标准错误流,cerr 对象是非缓冲的,且每个流插入到 cerr 都会立即输出。*/
 cerr << "Error message : " << str << endl;
/*标准日志流对象是缓冲的。这意味着每个流插入到 clog 都会先存储在缓冲区,直到缓冲填满或者缓冲区刷新时才会输出。*/
 clog << "Error message : " << str << endl;

数据结构

  • 定义结构

    struct Books
    {
       char  title[50];
       char  author[50];
       char  subject[100];
       int   book_id;
    } book;
    
  • 访问结构成员

    Book.title

  • 结构作为函数参数

   Book Book1;
   strcpy( Book1.title, "C++ 教程");
   strcpy( Book1.author, "Runoob"); 
   strcpy( Book1.subject, "编程语言");
   Book1.book_id = 12345;
   cout << "书标题 : " << book.title <<endl;
   cout << "书作者 : " << book.author <<endl;
   cout << "书类目 : " << book.subject <<endl;
   cout << "书 ID : " << book.book_id <<endl;
  • 只想结构的指针
struct Books *struct_pointer;
struct_pointer = &Book1;
struct_pointer->title;
  • typedef(起别名)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值