C++ Primer 学习笔记-第一章

此笔记仅记录容易忘记的知识点,对于已经掌握或者比较容易的知识点,此笔记将不涉及。

1.1 程序的标准结构:

int main(){
return 0;
}

返回类型:return type; 函数名:function name; 形参列表(括号内):parameter lists; 函数体{大括号内}:function body;

1.2 iostream (输入输出流)+注释方式

#include <iostream> //header头文件

int main(){
    std::cout<<"Enter 2 numbers"<< std::endl; //endl表示操作符:manipulator
    int v0=0, v2=0;
    std::cin>>v0;   //std表示命名空间namespace,防止不同库中具有相同名字的内容冲突
    std::cin>>v2;   //>> 与 << 表示运算符

    std::cout << "These 2 numbers are :" << v0 <<"and" <<v2;
}

/*
*
*多行注释
*
*/
//单行注释
//注释不可嵌套使用

1.3 while 语句:注意+=,-=,++x,--x

// CPPPC1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream> //header头文件

int main() {
    int val = 50;
    int n = 0;
    int n2 = 10;
    int sum = 0, sum2=0;

    while (n<=50) {
        sum += val;
        ++n;    
    }
 std::cout << "The sum from 50 to 100 is " << sum<< std::endl;
    
      while (n2>=0) {
          sum2 += n2;
          --n2;  
      }
 
std::cout << "The sum from 0 to 10 is " << sum2;
}

//读取数量不确定的输入
int main() {

	int sum = 0;
	int value = 0;

	while (std::cin>>value) {
		sum += value;	
	}
	std::cout << "The sum of the input is :" << sum;
	return 0;
	}

1.4 for语句:注意一点,在进入for循环前,需要判断一次。

1.5 编译错误类型:

  • 语法错误:syntax error 程序中存在语法错误-错写,漏写等
  • 类型错误:type error 变量类型出错
  • 声明错误:decleration error 程序中使用了没有提前声明的变量;

1.6 if 语句

1.7 C++的缩进格式:坚持使用一个编程风格,并尽可能提高可读性和易理解性

1.8 类简介:

  • Class类为程序员自己编写的具有一系列特征的对象类型;
  • 一般将类封装成一个.h文件内,编写程序时,需要将.h头文件引入:
  • 注意!!.h文件需要放置在项目文件夹下,否则无法找到
  • 当调用一个class内置方法时,需要使用调用运算符():例如:

Sales_items book1;

std::cout<< book1.isbn();

#include <iostream>  //引用标准程序库
#include "Book.h"   //使用程序员定义程序库

第I部分 C++基础

  • C++是静态数据类型语言,与Python等不同,C++在编译时,编译器必须知道程序中每一个变量对应的数据类型。

第2章 变量和基本类型

1.无符号数定义: 注意:带符号数和无符号数不能混用,否则会容易发生异常(超出无符号数的范围)

                 也就是说:不管什么样的情况,如果不确定无符号数是否需要进行计算,那么都不要使用unsigned 去声明变量

2.字面值常量(literal):

                          当我们在不需要定义变量的情况下,在程序中直接让程序输入/输出某些内容,程序会自动匹配其所对应的格式

                          例如:当使用40时,程序会自动匹配int,long, long long中最小的类型;‘A’  “Hello” 也会匹配字符或者字符串。

3.转义序列(escape sequence): \n \t 等 


4. 变量:


4.1 初始化和赋值的区别:初始化是设计一个初始值,并赋给变量;而赋值是将之前的内容进行抹除,然后使用新的数值进行替代。


4.2 初始化分为:列表初始化和默认初始化

*变量初始化时需要注意事项:除非必须进行默认初始化(不赋初值),其他变量在声明时,一律进行赋值初始化

*列表初始化:实际上时C++11里面新特性。在变量名后使用{dff}(11)即可完成赋值

//1 列表初始化:在C++1之后,可以使用大括号{}对变量进行初始化
//例如:以下四种方式,均可以初始化变量值
int units_sold=0;
int units_sold ={0};

int units_sold{0};
int units_sold(0);

//int a{0}; -->给a 赋值0
//2.默认初始化:就是仅仅声明一个函数的类型,而不指定初值(称为非显式初始化)
//例如:
    std::string empty; //非显式初始化为一个空字符串

4.3 变量声明和定义的关系

C++语言支持分离式编译(separete compilation),一个程序可能会调用其他程序的内容:

变量声明: 定义变量类型,名称 而不一定赋初值(不分配内存空间)

变量定义:  定义变量类型,名称,并赋初值

* 尤其适合在多个程序中,使用同一变量的情况

*变量可以进行多次声明,但尽可以进行一次定义

extern int i; //变量声明-不赋初值
int j;        //变量定义-赋给初值(主动被动均算)
int iy;       //变量定义
extern int iz;//变量声明

4.4 标识符(identifier)(变量+类的命名规范)!!

  • 用户定义的变量名(变量标识符):一般使用小写字母:如index,lesson;
  • 用户定义的类名,一般以大写字母开头:如Sales_item;
  • 若标识符由多个单词构成,那么单词之间应该有明显区分: 如 student_loan, studnentLoan;
  • C++内置关键词不可以使用(书P43)


4.5 名字的作用域(scope - global +block)

  • 变量名称的作用域始于变量的定义位置,结束与程序段的末尾位置;
  • 作用域分为全局作用域和块作用域;
  • 建议:第一次使用变量的时候,再去定义它:以便于找到变量的定义,赋予合适的初值。

4.6 复合类型(compound type)-此处主要为:引用和指针

不用困惑&和*的意义,仅需要知道它们是声明的一部分就好。

4.6.1 引用reference(重要)

  • 引用即别名:意思是,定义引用时,程序把引用的变量与他的初值绑定在一起,而不是拷贝一份新的初始值给引用;
  •                       当引用初始化完成后,其值将于初始值对象一直绑定在一起!
  • 可以简单的理解成:通过引用方式创建的引用对象,实际上就是一个已有变量的‘快捷方式’, 内存指向已有的变量存储位置
  • -> 引用并非对象,相反的,它只是为一个已经存在的对象所起的另一个名字;同时,对引用对象进行赋值时,其所代表的值也发生变化。
  • //引用的例子:
    int ival =1024; //定义一个ival对象,并赋值1024
    int &refVal = ival //将引用指向已经存在的ival变量(实际上就是取ival对象的地址内的值)
    
    //注意!
     refVal = 2; //把2赋值给refVal指向的对象-->实际上就是将ival数值修改2;
    

                                 

                                       

 4.6.2 指针(pointer)

  • 指针是另外一种复合类型,也实现了对其他对象的间接访问
  • 指针特点 1.指针本身就是一个对象,允许对指针进行赋值和拷贝;
  •                    2.指针在定义时无需赋初值(若在块作用域内定义的指针没有被初始化,其将拥有一个不确定的值;
  •                    3. 除了特殊情况,在进行指针声明时,指针的类型与其所指的对象的类型一致;
  •                    4.由于指针所存储的是对象的地址,因此在进行赋值时,需要使用&x符号,获取对象地址, 对指针进行赋值

                                          

指针定义:
int *pi1,*p12; //pi1与pi2都是指向int类型对象的指针
double dp,*dp2; //dp是double型的对象,dp2是指向double类型对象的指针

指针赋值:
int ival=20; 
int *p1=nullptr; //定义一个名为p1的空指针!!!重要
int *p2=&ival    //定义一个名为p2的指针,并将ival变量的地址存储在p2指针内







* 和&符号的多种含义

int i=42;    //定义一个整型变量i,赋值42
int &r=i;    //定义一个名称为r的引用,为i的替身
int *p;      //定义一个名称为p的整型指针
p=&i;        //将变量i的地址赋给指针
*p=i;        //将变量i,赋值给指针p所指向的地址内的数值
int &r2=*p;  //定义一个名称为r2的引用,为指针p所指向对象的替身

指针值

  • 指针值可为:指向一个对象(主要使用,其他的尽可能避免使用,以防出现未知错误);指向紧邻对象所占空间的下一个位置;空指针(意味着指针没有任何对象);无效指针(Other)。
  • 在声明指针类型变量是,要注意:
  •        1. 指针的类型与其所指的地址内的变量类型需要保持一致;
  •        2.指针在定义时,需要将其首先设置为空指针: int *p=nullptr;或者=0;

 

  • 赋值和指针:虽然指针和引用都能提供对其他对象的间接访问,主要不同是:一旦定义了引用,在程序中就不能对这个引用进行修改;而指针则可以随时修改其所指的对象的地址(修改绑定对象);
  • Tips: 如何确定赋值语句到底是修改了指针本身的值还是指针所代表的值时:
  •         -->永远只看等号左侧的对象是什么:
  • 注意!!int *pi定义名为pi的指针--->pi是指针对象,*pi是指针所指的地址内的数值
  • int i=42;         //设置int类型对象
    int *pi=0;        //设置一个名为pi的空指针,没有指向任何对象
    int *pi2=&i;      // 声明一个pi2指针对象,pi2这个指针内存有i的地址
    int *pi3 ;        // 定义一个名为pi3的指针,其值无法确定
    
    pi3=pi2;          //将pi2赋值给pi3,此时,pi3也指向pi2的对象
    pi2=0;            //清除pi2内容,此时,pi2已经不指向任何对象了
    
    //分清到底是改变了什么
    
    pi=&ival ;         //pi这个指针存有ival变量地址了,pi指向ival;
    *pi=0 ;            //注意!!指针pi所指的地址内的对象被改变,指针本身没变
  • 其他指针操作:若指针变量不是空指针,那么若用这个指针对象作为判断条件时为true,否则为false
  • int ival=1024 ; //定义一个整型变量
    int *pi=0;      //定义一个整型空指针
    int *pi2=&ival; //定义一个整型指针,并存放ival的地址
    
    if(pi1){        //false
    
    }
    
    if(pi2){        //true
    
    }

    4.6.3 理解复合类型的声明

  • 指向指针的指针:

通过*的个数可以区分指针的类别:
    *是指针
    **是指向指针的指针
    ***是指向指针的指针的指针
以此类推:
例如:
    int ival=1024;    //定义一个整型对象
    int *pi= &ival;   //pi为指向int型的数
    int **ppi = &pi;   //ppi指向一个int型的指针

                        

  • 指向指针的引用:

                               


4.7 const 限定符(书p86):const/constexpr/常量指针等/constexpr变量等

若想定义一个不可改变的变量,可以使用const关键词,但这种情况仅在当前程序段中有效;

若某些时候需要一种const变量,但是有必要在文件中共享,那么解决的方法是使用extern const int 关键字

                    

 

4.8  处理类型 (t'y'pe alias)

  处理类型主要作用是:复杂程序变量较多,不容易检查;为了提高效率,引入类型别名的概念:

  4.8.1 类型别名(type alias):关键字typedef (代替标准类型名)

  类型别名实际上就是给复杂类型起一个别名,以后定义/使用变量时,直接使用别名即可:

  4.8.2 别名声明( alias declaration):关键字using,创建一个代替自定义类名的别名 (代替自定义类型名)

//类型别名:主要是创建一个类型的别名,减少重复性,明确内容;具体方法为:

    typedef double wages;     //wages 从此之后与double是同义词
    typedef wages base, *p;   //base 是double的同义词,p是 double*的同义词

//别名声明(用来定义类型类型的别名)

    using SI = Sales_items;  //从此之后,SI是Sales_item 同义词

//---------------------------------------------------------------------------

    wages hourly, weekly;    //定义两个double类型变量
    SI item;                 //定义一个Sales_item item 对象

  4.8.3 auto类型说明符 (自动根据变量的初始值,匹配适合变量的类型)C++11新特性

          语法: auto item =3.14;(匹配为float) auto age=20; (匹配为int)

          注意:auto 关键字一般会忽略顶层const

             

                

  4.8.4 decltype 类型指示符(自动设置和已有变量相同的类型,以防忘记)

//decltype 类型指示符-定义一个变量类型为已有变量的类型或者是函数返回值的类型
//总结! decltype() 括号内的是函数,那么变量值为函数返回值的类型,如果是变量,那么和变量值一致

//例子:

decltype(f()) sum=x; //sum的类型是函数f()的返回值

const int ci=0, &cj=ci;
decltype(ci) x=0; //x的类型是int
decltype(cj) y=x; //y的类型是const int&, 将y绑定到x,实际上是一个引用
decltype(cj) z;   //错误! z是一个引用类型对象,需要初始化

//另一注意事项:
int i=22;
decltype ((i)) d; //双层括号->d是int&引用格式,要初始化!!
decltype (i) e;   //e是未初始化的int值

4.9  自定义数据结构 (实际上就是定义一个class)

4.9.1 自定义一个类:

   自定义类的语法为:以struct开始,紧跟着类名+类体,类体外以分号结尾: struct Sales_data{xxx};

                                                        

4.9.2 头文件.h保护符:(就是:在自定义头文件时,添加进去即可)

                             


 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值