C++随笔笔记(一) 基础篇

1.1 C++简介

四大特性:抽象、封装、继承、多态

数据抽象:一种仅向用户暴露接口而把具体的实现细节隐藏起来的机制。

数据封装:是一种把数据和操作数据的函数捆绑在一起的机制

标准的 C++ 由三个重要部分组成:

  • 核心语言,提供了所有构件块,包括变量、数据类型和常量,等等。
  • C++ 标准库,提供了大量的函数,用于操作文件、字符串等。
  • 标准模板库(STL),提供了大量的方法,用于操作数据结构等。

2.1 C++基本语法

C++标识符

C++ 标识符是用来标识变量、函数、类、模块,或任何其他用户自定义项目的名称。一个标识符以字母 A-Z 或 a-z 或下划线 _ 开始,后跟零个或多个字母、下划线和数字(0-9)。

C++ 标识符内不允许出现标点字符,比如 @、$ 和 %。C++ 是区分大小写的编程语言。因此,在 C++ 中,Manpower 和 manpower 是两个不同的标识符。


3.1 C++数据类型

C++ 标识符是用来标识变量、函数、类、模块,或任何其他用户自定义项目的名称。一个标识符以字母 A-Z 或 a-z 或下划线 _ 开始,后跟零个或多个字母、下划线和数字(0-9)。

C++ 标识符内不允许出现标点字符,比如 @、$ 和 %。C++ 是区分大小写的编程语言。因此,在 C++ 中,Manpower 和 manpower 是两个不同的标识符。

变量的大小会根据编译器和所使用的电脑而有所不同。sizeof(char)测试数据类型大小

typedef声明

typedef type newname

例如下列

typedef int feet;
feet distance
枚举类型
enum color{red,green,blue} c;
c = blue;

默认情况下,第一个名称的值为 0,第二个名称的值为 1,第三个名称的值为 2,以此类推。但是,您也可以给名称赋予一个特殊的值,只需要添加一个初始值即可。例如,在下面的枚举中,green 的值为 5。

enum color { red, green=5, blue };

在这里,blue 的值为 6,因为默认情况下,每个名称都会比它前面一个名称大 1。

4.1 C++变量作用域

初始化局部变量和全局变量

当局部变量被定义时,系统不会对其初始化,您必须自行对其初始化。定义全局变量时,系统会自动初始化为下列值:

数据类型初始化默认值
int0
char'\0'
float0
double0
pointerNULL

正确地初始化变量是一个良好的编程习惯,否则有时候程序可能会产生意想不到的结果。

5.1 C++常量

整数常量

整数常量可以是十进制、八进制或十六进制的常量。前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制。

整数常量也可以带一个后缀,后缀是 U 和 L 的组合,U 表示无符号整数(unsigned),L 表示长整数(long)。后缀可以是大写,也可以是小写,U 和 L 的顺序任意。

浮点数常量

浮点常量由整数部分、小数点、小数部分和指数部分组成。您可以使用小数形式或者指数形式来表示浮点常量。当使用小数形式表示时,必须包含小数点、指数、或者两者都包含。当使用指数形式时,必须包含整数部分、小数部分、或者同时包含两者。带符号的指数是用e或者E引入的。

定义常量

定义常量在C++中,有两种简单的方式

.使用#define预处理器

.使用const关键字

6.1 C++存储类

C++ 程序中可用的存储类:

  • auto
  • register
  • static
  • extern
  • mutable        

注:for( ; ; ){ }为无限死循环

switch( )中只能为整形或枚举类型

7.1 C++函数

函数参数

调用类型:

传值调用:

指针调用:void  swap(int * x,int *y); 调用的话swap(&a,&b);

引用调用

函数声明:void swap(int &x, int &y); 调用的话直接swap(a,b);

参数的默认值

#include <iostream>
using namespace std;
 int sum(int a, int b=20){
  int result;
  result = a + b;
  return (result);
}
int main (){
   // 局部变量声明
   int a = 100;
   int b = 200;
   int result;
   // 调用函数来添加值
   result = sum(a, b);
    cout << "Total value is :" << result << endl;     // 再次调用函数
    result = sum(a); 
    cout << "Total value is :" << result << endl;
    return 0;
} 

输出分别为:300   120

C++ 随机数

#include<iostream>
#include<ctime>
#include<cstdlib>
using namespace std;
int main(){
    int i,j;
    //设置种子
    srand((unsigned)time(NULL));
    for(int i=0;i<10;i++){
        j=rand();
        cout<<"随机数:"<<j<<endl;
    }
    return 0;
}

8.1 C++数组

指向数组的指针

数组名是一个指向数组中第一个元素的常量指针。

double *p;
double balance[10];
p = balance;
此时的balance[i]==*(p+i)==*(balance+i);

传递数组给函数

c++不允许向函数传递一个完整的数组作为参数,已通过指定不带索引的数组名来传递一个指向数组的指针。

同时函数定义方式有如下几种形式 :

void myFunction(int *param){}
void myFunction(int param[10]){}
void myFunction(int param[]){}
enum color { red, green=5, blue };

在这里,blue 的值为 6,因为默认情况下,每个名称都会比它前面一个名称大 1。


初始化局部变量和全局变量

当局部变量被定义时,系统不会对其初始化,您必须自行对其初始化。定义全局变量时,系统会自动初始化为下列值:

数据类型初始化默认值
int0
char'\0'
float0
double0
pointerNULL

正确地初始化变量是一个良好的编程习惯,否则有时候程序可能会产生意想不到的结果。

整数常量

整数常量可以是十进制、八进制或十六进制的常量。前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制。

整数常量也可以带一个后缀,后缀是 U 和 L 的组合,U 表示无符号整数(unsigned),L 表示长整数(long)。后缀可以是大写,也可以是小写,U 和 L 的顺序任意。7.1

从函数返回数组

伪代码
int *getArray(){
   static int r[10]={1,2,3,4}; //C++不支持在函数外返回局部变量的地址,除非定义的局部变量为static变量
     return r;
}
int main(){
int *p;
p=getArray();
return 0;
}

9.1  C++指针

null指针

在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋予一个NULL值是一个良好的编程习惯,赋予NULL值得指针被称为空指针,他的地址为0 即if(!ptr)成立

C++指针的算术运算

指针可以进行四种算术运算:++、--、+、-

假设ptr是一个指向地址为1000的整数指针,是一个32位的整数,让我们对该指针执行下列算术运算:

ptr++

执行完此操作后,ptr将指向位置1004,因为ptr每增加一次,它都将指向一个整数位置,即当前位置往后移动4个字节。这个运算会在不影响内存位置中世纪值得情况下,移动指针到下一个内存位置。

经常用指针代替数组,因为变量指针可以递增或者递减,而数组不能递增或者递减,因为数组是一个常量指针。

指针数组:

#include <iostream>
using namespace std;
const int MAX = 4; 
int main (){
 const char *names[MAX] = {
                   "Zara Ali",
                   "Hina Ali",
                   "Nuha Ali",
                   "Sara Ali",
   };
   for (int i = 0; i < MAX; i++){
      cout << "Value of names[" << i << "] = ";
      cout << names[i] << endl;
   }    return 0;
}

C++ 指向指针的指针(多级间接寻址)

int **var;
int var=300;
int *ptr=&var;
int **pptr=&ptr;
cout<<(*ptr)<<(**pptr)<<endl;

10.1 C++引用

引用与指针的区别:

  • 不存在空引用。引用必须连接到一块合法的内存。
  • 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以任何时候指向另一个对象。
  • 引用必须在创建时初始化。指针可以在任何时间被初始化。

int i=17;
int & r=i;

C++把引用作为返回值

当函数返回一个引用时,则返回一个指向返回值的隐式指针。这样,函数就可以放在赋值语句的左边。例如:

  #include<bits/stdc++.h>
   using namespace std;
   double vals= {1.1,2.2,3.3,4.4};
   double& setValues(int i){
   return vals[i];  //返回第i个元素的引用
}
int main(){
   cout<<"改变前的值"<<endl;
    for(int i=0;i<5;i++){
        cout<<"vals["<<i<<"]=";
        cout<<vals[i]<<endl;        }
setValues(1)=22.22;//改变第2个元素的值
setValues(3)=222222.2;
cout<<vals[1]<<" "<<vals[3]<<endl; }return 0;}

当返回一个引用时,要注意被引用的对象不能超出作用域。所以返回一个对局部变量的引用是不合法的,但是可以返回一个静态变量的引用

int& func() {
   int q;
   //! return q; // 在编译时发生错误
   static int x;
   return x;     // 安全,x 在函数作用域外依然是有效的
}

11. 1 C++基本的输入输出 

标准错误流(cerr)

预定义的对象 cerr 是 ostream 类的一个实例。cerr 对象附属到标准错误设备,通常也是显示屏,但是 cerr对象是非缓冲的,且每个流插入到 cerr 都会立即输出。

标准日志流(clog)

预定义的对象 clog 是 ostream 类的一个实例。clog 对象附属到标准错误设备,通常也是显示屏,但是 clog对象是缓冲的。这意味着每个流插入到 clog 都会先存储在缓冲在,直到缓冲填满或者缓冲区刷新时才会输出。

clog 也是与流插入运算符 << 结合使用的,如下所示:

clog<<"ddddd"<<endl;

12.1 C++数据结构

指向结构的指针

您可以定义指向结构的指针,方式与定义指向其他类型变量的指针相似,如下所示:

struct Books *struct_pointer;

现在,您可以在上述定义的指针变量中存储结构变量的地址。为了查找结构变量的地址,请把 & 运算符放在结构名称的前面,如下所示:

struct_pointer = &Book1;

为了使用指向该结构的指针访问结构的成员,您必须使用 -> 运算符,如下所示:

struct_pointer->title;

typedef 关键字

下面是一种更简单的定义结构的方式,您可以为创建的类型取一个"别名"。例如:

typedef struct
{
   char  title[50];
   int   book_id;
}Books;

现在,您可以直接使用 Books 来定义 Books 类型的变量,而不需要使用 struct 关键字。下面是实例:

Books Book1, Book2;

您可以使用 typedef 关键字来定义非结构类型,如下所示:

typedef long int *pint32;
pint32 x, y, z;

x, y 和 z 都是指向长整型 long int 的指针。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值