当前位置:   article > 正文

C++基础入门_c++入门

c++入门

一、基本概念
1、什么是C++

C++是C语言的继承,即兼容了C语言面向过程的程序设计能力,又能做面向对象的程序设计。

2.C++的一些基本特点:

(1)C++文件一般以 .cpp 结尾(c plus plus) .cc .C

(2)编译(Liunux环境):

    g++ xxx.cpp -o app

(3)C++头文件

    C++标准的头文件是没有 .h的

#include <iostream>

   C++兼容C语言的头文件:         

  1. #include <cstdlib>
  2. #include <stdlib.h>

3.C++兼容大部分C语言(不完全兼容) C++编译器更严格

        比如 void * 类型转换成 int * ,在C语言中,无需显性的指定,默认是允许的,在C++中,编译检查的更严格,不允许
        C++中main函数的返回值必须为 int

二、输入和输出

1、第一个程序 hello world

  1. #include <iostream> // 输入输出流的头文件
  2. int main(){ // 要求main函数的返回值必须为int
  3. std::cout << "hello" << " world" << std::endl
  4. /* std 命名空间
  5. * :: 是C++ 特有的,叫 作用域限定符
  6. * cout C++给我们提供的输出流对象
  7. * << 流输出运算符,表示向输出流对象输出数据(可以级联使用)
  8. *endl 换行 end line
  9. */
  10. return 0;
  11. }
  12. //执行结果
  13. linux@Ubuntu1:~$ ./a.out
  14. hello world

2. 输出流cout
    cout会自动识别要输出的变量的类型

例:

  1. #include <iostream>
  2. int main()
  3. {
  4. int a = 100;
  5. double b = 3.14;
  6. std::cout << "hello" << " world" << std::endl; //自动识别字符串
  7. std::cout<<a<<std::endl; //自动识别int
  8. std::cout<<b<<std::endl; //自动识别double
  9. return 0;
  10. }
  11. //执行结果
  12. linux@Ubuntu1:~$ ./a.out
  13. hello world
  14. 100
  15. 3.14

//cout的一些格式化输出

  1. #include <iostream>
  2. #include <iomanip> //要加上头文件
  3. int main()
  4. {
  5. int a = 63;
  6. std::cout<<std::dec<<a<<std::endl;   //10进制
  7. std::cout<<std::hex<<a<<std::endl;   //16进制
  8. std::cout<<std::oct<<a<<std::endl;  //8进制
  9. double d = 3.1415926;
  10. std::cout<<d<<std::endl;
  11. std::cout<<std::setprecision(3)<<d<<std::endl;  //保留三位小数
  12. return 0;
  13. }
  14. //执行结果
  15. linux@Ubuntu1:~$ ./a.out
  16. 63
  17. 3f
  18. 77
  19. 3.14159
  20. 3.14

3. 输入流 cin

  1. #include <iostream>
  2. int main()
  3. {
  4. int a;
  5. std::cout<<"请输入......"<<std::endl
  6. std::cin>>a;
  7. std::cout<<a<<std::endl;
  8. return 0;
  9. }
  10. //执行结果
  11. linux@Ubuntu1:~$ ./a.out
  12. 请输入......
  13. 159
  14. 159

练习:

输入一个字符,如果是大写的,转成小写的,如果是小写的,转成大写的,并输出

  1. #include <iostream>
  2. using namespace std;
  3. int main ()
  4. {
  5. char str;
  6. cout << "空格键退出"<<endl;
  7. do{
  8. cout << "请输入......" <<endl;
  9. cin.get(str);
  10. if(str == '\n') {
  11. cout << "输入为空" << endl;
  12. continue;
  13. }
  14. if (str >= 65 && str <= 90){
  15. cout << "输入为大写字母,转换为小写为: ";
  16. str += 32;
  17. cout.put(str) << endl;
  18. cin.ignore(100,'\n');
  19. }else if(str >= 97 && str <= 122){
  20. cout << "输入为小写字母,转换为大写为: ";
  21. str -= 32;
  22. cout.put(str) << endl;
  23. cin.ignore(100,'\n');
  24. }else{
  25. if(str == 32) break;
  26. cout << "请输入字母" << endl;
  27. cin.ignore(100,'\n');
  28. }
  29. } while(1);
  30. return 0;
  31. }
  32. //执行结果
  33. linux@Ubuntu1:~$ ./a.out
  34. 空格键退出
  35. 请输入......
  36. a
  37. 输入为小写字母,转换为大写为: A
  38. 请输入......
  39. A
  40. 输入为大写字母,转换为小写为: a
  41. 请输入......
  42. z
  43. 输入为小写字母,转换为大写为: Z
  44. 请输入......
  45. Z
  46. 输入为大写字母,转换为小写为: z
  47. 请输入......
  48. 输入为空
  49. 请输入......

二、命名空间(名字空间)

1.作用:

在大型项目的开发中,一般都是多个人同时开发,经常会出现命名冲突

这种冲突,称之为命名污染,

命名空间的作用,就是“防止命名污染

2.用法:

(1) std::cout

在名字前面加上 命名空间和作用域限定符 std::

C++中标准的名字都是std命名空间中的

(2) using std::cout

在使用前,加上 using 命名空间::名字

在其作用域中,后面使用名字时就不用每次都加了

(3) using namespace std;

表示整个文件中都可以使用 std 命名空间中的所有名字

3.自己写命名空间:

格式:

  1. namespace 命名空间名{
  2. 类型 变量名字;
  3. }

例1:

  1. #include <iostream>
  2. using namespace std;
  3. namespace Toy{
  4. char name[32] = "玩具熊";
  5. }
  6. int main(){
  7. cout<< "最爱的玩具是: "<<Toy::name<<endl;
  8. return 0;
  9. }
  10. //执行结果
  11. linux@Ubuntu1:~$ ./a.out
  12. 最爱的玩具是: 玩具熊

例2:

  1. #include <iostream>
  2. using namespace std;
  3. namespace Toy{
  4. char name[32] = "玩具熊";
  5. }
  6. using Toy::name;
  7. int main(){
  8. cout<< "最爱的玩具是: "<<name<<endl;
  9. return 0;
  10. }
  11. //执行结果
  12. linux@Ubuntu1:~$ ./a.out
  13. 最爱的玩具是: 玩具熊

例3:

  1. #include <iostream>
  2. using namespace std;
  3. namespace Toy{
  4. char name[32] = "玩具熊";
  5. }
  6. using namespace Toy;
  7. int main(){
  8. cout<< "最爱的玩具是: "<<name<<endl;
  9. return 0;
  10. }
  11. //执行结果
  12. linux@Ubuntu1:~$ ./a.out
  13. 最爱的玩具是: 玩具熊

例4:

  1. #include <iostream>
  2. using namespace std;
  3. namespace Toy{
  4. char name[32] = "玩具熊";
  5. }
  6. namespace Snack{
  7. char name[32] = "饼干";
  8. }
  9. using namespace Toy;
  10. using namespace Snack;
  11. int main(){
  12. //cout<<name<<endl; 有歧义 是错误的 编译会报错
  13. cout<< "最爱的玩具是 "<<Toy::name<<endl;
  14. cout<< "最爱的零食是 "<<Snack::name<<endl;
  15. return 0;
  16. }
  17. //执行结果
  18. linux@Ubuntu1:~$ ./a.out
  19. 最爱的玩具是 玩具熊
  20. 最爱的零食是 饼干

 例5:

  1. #include <iostream>
  2. using namespace std;
  3. namespace Toy{
  4. char name[32] = "玩具熊";
  5. }
  6. namespace Snack{
  7. char name[32] = "饼干";
  8. }
  9. using namespace Toy;
  10. using namespace Snack;
  11. char name[32] = "小猪佩奇"
  12. int main(){
  13. cout<< "最爱看的动画片是"<<::name<<endl; //没有名字空间的名字 会放在匿名空间空
  14. cout<< "最爱的玩具是 "<<Toy::name<<endl;
  15. cout<< "最爱的零食是 "<<Snack::name<<endl;
  16. return 0;
  17. }
  18. //执行结果
  19. linux@Ubuntu1:~$ ./a.out
  20. 最爱看的动画片是 小猪佩奇
  21. 最爱的玩具是 玩具熊
  22. 最爱的零食是 饼干

例6:

  1. #include <iostream>
  2. using namespace std;
  3. namespace Toy{
  4. char name[32] = "玩具熊";
  5. }
  6. using namespace Toy;
  7. int main(){
  8. char name[32] = "小猪佩奇";
  9. cout<< "最爱看的动画片是 "<<name<<endl; //局部优先原则,优先使用函数内部的名字
  10. return 0;
  11. }
  12. //执行结果
  13. linux@Ubuntu1:~$ ./a.out
  14. 最爱看的动画片是 小猪佩奇

例7:

  1. #include <iostream>
  2. using namespace std;
  3. namespace Worker{
  4. namespace Teacher{
  5. char name[32] = "李四";
  6. }
  7. char name[32] = "张三";
  8. }
  9. using namespace Worker::Teacher;//命名空间可以嵌套 --不常用
  10. int main(){
  11. cout<<name<<endl;
  12. return 0;
  13. }
  14. //执行结果
  15. linux@Ubuntu1:~$ ./a.out
  16. 李四

命名空间总结:

1.命名空间的使用:

Toy::name

2.命名空间的使用:

using Toy::name;

3.命名空间的使用:

using namespace Toy;

4.使用名字有歧义的时候,需要加上 命名空间名::

5.匿名空间,没有命名空间的名字,都在匿名空间里 访问需要加 ::

::name

6.和局部变量名冲突时,局部优先原则,名字空间中的名字被覆盖

7.名字空间可以嵌套使用-----不常用

C/C++中,函数的外面只能写声明,不能写实现逻辑

所以说,命名空间只对名字起作用

三、C++中的字符串

1.C++中字符串有两种处理方式

1.c风格的:

  1. char *p = "hello world";
  2. char arr[] = "hello world";

2.c++风格:

string 类型;

 string str = "hello world";

使用string需要加头文件

  1. #include <iostream>
  2. using namespace std;
  3. #include <string> //如果加了std 此处的string就不是必须的了
  4. int main(){
  5. string s1 = "hello world";
  6. scout << s1<< endl;
  7. return 0;
  8. }

3.string类型的初始化和赋值

1.一个变量

  1. string s1="hello"; //初始化的方式1
  2. string s2("world"); //初始化的方式2
  3. string s3; s3 = s1; //赋值的方式 1 相当于strcpy()
  4. string s4; s4 = "world"; //赋值的方式 2

2.两个变量

  1. string s1="hello";
  2. string s2(s1);
  3. string s3 = s1;
  4. string s4 = s1+s2; //相当于strcat() 

4.string类型的比较 == != > < >=

//相当于strcmp()

  1. string s1="hello";
  2. string s2="hallo";
  3. string s3="hello";
  4. if(s1 == s3){
  5. cout<<"s1 == s3"<<endl;//输出
  6. }
  7. if(s1 > s2){
  8. cout<<"s1 > s2"<<endl; //输出
  9. }else if(s1 < s2){
  10. cout<<"s1 < s2"<<endl;
  11. }
  12. return 0;
  13. }

5.对于string类型,有两个重要函数

  1. empty() //判断是否为空 如果为 0:不是空 非0:空
  2. size() //返回字符串的长度 不包含\0

例:

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. int main(){
  5. string s1 = "hello";
  6. if(s1.empty()){
  7. cout<<"s1 为空"<<endl;
  8. }else{
  9. cout<<"s1 不为空"<<" size:"<<s1.size()<<endl;
  10. }
  11. return 0;
  12. } //结果为 s1 不为空 size:5 -----不包含 \0

6.c风格和C++风格字符串的转换

  1. c++ --> c
  2. string s1 = "hello";
  3. printf("%s",s1.c_str());
  4. // string.c_str() 将C++中的string转换成C中的字符串
  5. C --> C++
  6. C中的字符串自动转换成C++的字符串
  7. int main(){
  8. string s1="hello";
  9. char arr[] = "hello";
  10. if(s1 == arr){
  11. cout<<"yes"<<endl;
  12. }
  13. return 0;
  14. }

7.对string中某一位进行访问

  1. string s1="hello";
  2. s1[1] = 'a'; //支持以下标的形式访问string中的某一位

8.字符串输入的问题

1.cin输入字符串,无法输入有空格的

  1. string s;
  2. cin>>s; //如果输入的是 hello world 那么s中只能存hello

2.getline() //输入字符串 遇到\n 结束

  1. string s;
  2. getline(cin,s);

四、bool类型

C++新增了bool类型, bool是 基本类型

1.表示真或者假的 0 为假 非0为真

  1. bool 变量可赋 true false
  2. bool b = true; //防止魔鬼数字

2.大小 1个字节

例:

  1. int main(){
  2. bool b1 = true;
  3. bool b2 = false; //bool类型的变量 可以用 false 和 true 赋值
  4. bool b3 = 10; //bool类型的变量也可以赋值数字
  5. bool b4 = 0; bool b5 = -10; //0为假 非0为真 (即使是负数,也为真)
  6. cout<<"bool_size : "<<sizeof(b1)<<endl; //bool类型大小为 1 字节
  7. cout<<"b1 : "<<b1<<endl; //输出bool变量的值 输出时,
  8. cout<<"b2 : "<<b2<<endl; //真为 1 假为0
  9. cout<<"b3 : "<<b3<<endl;
  10. cout<<"b4 : "<<b4<<endl;
  11. cout<<"b5 : "<<b5<<endl;
  12. cout<<"b5 : "<<boolalpha<<b5<<endl; //以字母的形式输出(true和false)
  13. //一旦设置后,后面的输出全是字母类型
  14. cout<<"b2 : "<<b2<<endl;
  15. cout<<"b5 : "<<noboolalpha<<b5<<endl; //改回以 0 1 的方式输出
  16. //一旦设置后,后面的输出全是0 1 方式
  17. cout<<"b2 : "<<b2<<endl;
  18. bool sex = 0; //女
  19. cout<<"sex:"<<(sex?"帅哥":"美女")<<endl; //bool变量用在三目运算符中
  20. return 0;
  21. }

五、引用(quote)

1.概念:

C++对C的一个重要的扩充,相当于给变量起别名。 ----相当于硬链接

2.定义引用:

& 引用的声明符

类型名 &引用变量名 = 被引用的变量名

例:

  1. #include <cstdio>
  2. int main(){
  3. int a = 100;
  4. int &b = a;
  5. cout<<"a : "<<a<<endl;//100
  6. cout<<"b : "<<b<<endl;//100
  7. printf("&a : %p\n",&a);//
  8. printf("&b : %p\n",&b);//和a的地址相同
  9. return 0;
  10. }

使用引用的要求:

1.定义引用时必须指定被引用的目标 ----定义引用必须要初始化

2.引用类型必须和被引用的类型保持一致

3.引用一旦被初始化,后面便不能修改引用的目标了

3.引用做形参 ----不用考虑值传递地址传递的问题了

例1:引用变量

  1. #include <iostream>
  2. using namespace std;
  3. void function(int &aa){
  4. aa = 200;
  5. }
  6. int main(){
  7. int a = 100;
  8. cout<<"a:"<<a<<endl;
  9. function(a);
  10. cout<<"a:"<<a<<endl;
  11. return 0;
  12. }

例2:引用指针

  1. #include <iostream>
  2. using namespace std;
  3. #include <cstdio>
  4. #include <cstdlib>
  5. void function(int* &aa){
  6. aa = (int *)malloc(sizeof(int));
  7. }
  8. int main(){
  9. int *p = NULL;
  10. function(p);
  11. *p = 100;
  12. cout<<*p<<endl;
  13. return 0;
  14. }

4.常引用

  1. int main(){
  2. int a = 100;
  3. const int &q = a;
  4. a = 200; //正确的,可以通过a修改值
  5. q = 200; //错误的,q是被const修饰的引用(是只读的)
  6. //不能通过q修改值
  7. const int &q1 = 200;//const修饰的引用 可以引用常量
  8. return 0;
  9. }

5.引用做函数的返回值

1.不可以返回局部变量的引用

2.可以返回全局变量或者static修饰的局部变量的引用

3.引用作为返回值,函数的返回值是一个左值

为了防止对函数的返回值进行乱改,一般返回 const 修饰的引用

  1. #include <iostream>
  2. using namespace std;
  3. const int &find_max(int x,int y){
  4. static int temp = x>y?x:y;
  5. return temp;
  6. }
  7. int main(){
  8. int ret = 5;
  9. find_max(10,20) = ret; //如果返回的不是const 修饰的引用,
  10. //那么此处函数的返回值可以被修改
  11. return 0;
  12. }

6.结构体中定义引用:

  1. struct __STU{
  2. int &q;
  3. };
  4. int main(){
  5. int a = 100;
  6. struct __STU s1; //错误
  7. struct __STU s2 = {a}; //如果结构体中有引用成员,定义变量时,必须初始化
  8. return 0;
  9. }

引用和指针的区别?

1.引用必须初始化,指针可以不初始化;

2.指针可以改变指向,引用不能改变引用的对象;

3.存在指向NULL的指针,不存在引用NULL的引用;

4.指针使用时需要做非NULL检查,引用不用;

5.可以定义指针数组、不可以定义引用数组

int a = 10,b = 20;

int *arr[2] = {&a, &b} //正确

------------------------------------

int &arr[2] = {a, b} //错误

6.可以定义数组指针,也可以定义数组引用 (但是有点区别:数组引用不能指向二维数组,如下例子)

int arr[2][2] = {10,20,30,40};

int (*arr_p)[2] = arr;

-----------------------------------

int arr[2] = {10,20};

int (&arr_p)[2] = arr;

7.可以定义指针函数,也可以定义引用函数

int *func_p(int a, int b){}

-----------------------------------

int &func_p(int a, int b){}

8.可以定义函数指针,也可以定义函数引用

int func(int a, int b){}

int (*func_p)(int a, int b);

func_p = func;

------------------------------------

int (&func_r)(int a, int b) = func;

9.可以定义指针的指针(二级指针) 不可以定义引用的引用(二级引用)

int a = 100;

int *p = &a;

int **pp = &p;

---------------------------------

int a= 100;

int &r = a;

int &&rr = r; //错误

int &&r = 100; // 可以 叫做右值引用,(常引用)

C++11以上版本的编译器才支持这种用法

g++ ***.cpp -std=c++11

有的同学的电脑是

g++ ***.cpp -std=c++0x

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

闽ICP备14008679号