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语言的头文件:         

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

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

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

二、输入和输出

1、第一个程序 hello world

#include <iostream>    // 输入输出流的头文件

int main(){            // 要求main函数的返回值必须为int

    std::cout << "hello" << " world" << std::endl
                      
    /* std 命名空间
     * :: 是C++ 特有的,叫 作用域限定符
     * cout C++给我们提供的输出流对象
     * << 流输出运算符,表示向输出流对象输出数据(可以级联使用)
     *endl 换行 end line
     */

    return 0;

}

//执行结果
linux@Ubuntu1:~$ ./a.out 
hello world

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

例:

#include <iostream> 
   
int main()
{        
    int a = 100; 
    double b = 3.14; 

    std::cout << "hello" << " world" << std::endl; //自动识别字符串 
    std::cout<<a<<std::endl;                       //自动识别int 
    std::cout<<b<<std::endl;                       //自动识别double 

    return 0; 
}

//执行结果
linux@Ubuntu1:~$ ./a.out 
hello world
100
3.14

//cout的一些格式化输出

#include <iostream> 
#include <iomanip>      //要加上头文件 

int main()
{   
    int a = 63; 
    std::cout<<std::dec<<a<<std::endl;              //10进制 
    std::cout<<std::hex<<a<<std::endl;              //16进制 
    std::cout<<std::oct<<a<<std::endl;               //8进制 

    double d = 3.1415926; 
    std::cout<<d<<std::endl; 
    std::cout<<std::setprecision(3)<<d<<std::endl;  //保留三位小数
    
    return 0; 
}

//执行结果
linux@Ubuntu1:~$ ./a.out 
63
3f
77
3.14159
3.14

3. 输入流 cin

#include <iostream> 

int main()
{ 
    
    int a; 
    std::cout<<"请输入......"<<std::endl
    std::cin>>a; 
    std::cout<<a<<std::endl; 
    
    return 0; 

}

//执行结果
linux@Ubuntu1:~$ ./a.out 
请输入......
159
159

练习:

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

#include <iostream>
using namespace std;

int main ()
{
    char str;
    cout << "空格键退出"<<endl;                                                                                    

    do{
        cout << "请输入......" <<endl;
        cin.get(str);
         
        if(str == '\n') {
    
            cout << "输入为空" << endl;
            continue;
    
        }

        if (str >= 65 && str <= 90){

            cout << "输入为大写字母,转换为小写为: ";
            str += 32;
            cout.put(str) << endl;
            cin.ignore(100,'\n');
        
        }else if(str >= 97 && str <= 122){
    
            cout << "输入为小写字母,转换为大写为: ";
            str -= 32;
            cout.put(str) << endl;
            cin.ignore(100,'\n');
                                                                                                                   
        }else{
            if(str == 32) break;
            cout << "请输入字母" << endl;
            cin.ignore(100,'\n');
        }
    } while(1);
    return 0;
}

//执行结果
linux@Ubuntu1:~$ ./a.out
空格键退出
请输入......
a
输入为小写字母,转换为大写为: A
请输入......
A
输入为大写字母,转换为小写为: a
请输入......
z
输入为小写字母,转换为大写为: Z
请输入......
Z
输入为大写字母,转换为小写为: z
请输入......

输入为空
请输入......

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

1.作用:

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

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

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

2.用法:

(1) std::cout

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

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

(2) using std::cout

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

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

(3) using namespace std;

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

3.自己写命名空间:

格式:

namespace 命名空间名{

类型 变量名字;

}

例1:

#include <iostream> 
using namespace std; 

namespace Toy{ 

    char name[32] = "玩具熊"; 

} 

int main(){ 

    cout<< "最爱的玩具是: "<<Toy::name<<endl; 
    return 0; 

} 

//执行结果
linux@Ubuntu1:~$ ./a.out 
最爱的玩具是: 玩具熊

例2:

#include <iostream> 
using namespace std; 
namespace Toy{ 

    char name[32] = "玩具熊"; 

} 

using Toy::name; 

int main(){ 

    cout<< "最爱的玩具是: "<<name<<endl; 
    return 0; 

} 

//执行结果
linux@Ubuntu1:~$ ./a.out 
最爱的玩具是: 玩具熊

例3:

#include <iostream> 
using namespace std; 
namespace Toy{ 

    char name[32] = "玩具熊"; 

}

using namespace Toy; 

int main(){ 

    cout<< "最爱的玩具是: "<<name<<endl; 
    return 0; 

} 

//执行结果
linux@Ubuntu1:~$ ./a.out 
最爱的玩具是: 玩具熊

例4:

#include <iostream> 
using namespace std; 
namespace Toy{ 

    char name[32] = "玩具熊"; 

}

namespace Snack{ 

    char name[32] = "饼干"; 

} 

using namespace Toy; 
using namespace Snack; 

int main(){ 
    //cout<<name<<endl; 有歧义 是错误的 编译会报错
    cout<< "最爱的玩具是 "<<Toy::name<<endl; 
    cout<< "最爱的零食是 "<<Snack::name<<endl; 
    return 0; 
} 

//执行结果
linux@Ubuntu1:~$ ./a.out 
最爱的玩具是 玩具熊
最爱的零食是 饼干

 例5:

#include <iostream> 
using namespace std; 
namespace Toy{ 

    char name[32] = "玩具熊"; 

}

namespace Snack{ 

    char name[32] = "饼干"; 

} 

using namespace Toy; 
using namespace Snack; 
char name[32] = "小猪佩奇"
int main(){ 
    cout<< "最爱看的动画片是"<<::name<<endl; //没有名字空间的名字  会放在匿名空间空
    cout<< "最爱的玩具是 "<<Toy::name<<endl; 
    cout<< "最爱的零食是 "<<Snack::name<<endl; 
    return 0; 
} 

//执行结果
linux@Ubuntu1:~$ ./a.out 
最爱看的动画片是 小猪佩奇
最爱的玩具是 玩具熊
最爱的零食是 饼干

例6:

#include <iostream> 
using namespace std; 
namespace Toy{ 

    char name[32] = "玩具熊"; 

}

using namespace Toy; 

int main(){ 
    char name[32] = "小猪佩奇";
    cout<< "最爱看的动画片是 "<<name<<endl; //局部优先原则,优先使用函数内部的名字
    return 0; 
} 

//执行结果
linux@Ubuntu1:~$ ./a.out 
最爱看的动画片是 小猪佩奇

例7:

#include <iostream> 
using namespace std; 
namespace Worker{ 

    namespace Teacher{
 
        char name[32] = "李四"; 

} 

    char name[32] = "张三"; 

} 

using namespace Worker::Teacher;//命名空间可以嵌套 --不常用 

int main(){ 

    cout<<name<<endl;
    return 0; 

}

//执行结果
linux@Ubuntu1:~$ ./a.out 
李四

命名空间总结:

1.命名空间的使用:

Toy::name

2.命名空间的使用:

using Toy::name;

3.命名空间的使用:

using namespace Toy;

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

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

::name

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

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

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

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

三、C++中的字符串

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

1.c风格的:

char *p = "hello world";

char arr[] = "hello world";

2.c++风格:

string 类型;

 string str = "hello world";

使用string需要加头文件


#include <iostream> 
using namespace std; 
#include <string>  //如果加了std 此处的string就不是必须的了

int main(){ 

    string s1 = "hello world"; 
    scout << s1<< endl; 
    return 0; 

}

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

1.一个变量

string s1="hello"; //初始化的方式1

string s2("world"); //初始化的方式2

string s3; s3 = s1; //赋值的方式 1 相当于strcpy()

string s4; s4 = "world"; //赋值的方式 2

2.两个变量

string s1="hello";

string s2(s1); 

string s3 = s1;

string s4 = s1+s2; //相当于strcat() 

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

//相当于strcmp()

string s1="hello";
string s2="hallo";
string s3="hello";

if(s1 == s3){

    cout<<"s1 == s3"<<endl;//输出 

    } 

if(s1 > s2){ 

    cout<<"s1 > s2"<<endl; //输出 

    }else if(s1 < s2){ 

    cout<<"s1 < s2"<<endl; 

    } 

    return 0; 

}

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

empty() //判断是否为空 如果为 0:不是空 非0:空

size() //返回字符串的长度 不包含\0

例:

#include <iostream> 
#include <string> 
using namespace std; 

int main(){ 

string s1 = "hello"; 

if(s1.empty()){ 

    cout<<"s1 为空"<<endl; 

    }else{ 

    cout<<"s1 不为空"<<" size:"<<s1.size()<<endl; 

    } 

    return 0; 

} //结果为 s1 不为空 size:5 -----不包含 \0

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

c++ --> c

string s1 = "hello";

printf("%s",s1.c_str());

// string.c_str() 将C++中的string转换成C中的字符串

C --> C++

C中的字符串自动转换成C++的字符串

int main(){ 

    string s1="hello"; 
    char arr[] = "hello"; 
    if(s1 == arr){ 

    cout<<"yes"<<endl; 
} 
    return 0; 
}

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

string s1="hello";

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

8.字符串输入的问题

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

string s;

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

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

string s;

getline(cin,s);

四、bool类型

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

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

bool 变量可赋 true false

bool b = true; //防止魔鬼数字

2.大小 1个字节

例:

int main(){ 

bool b1 = true; 
bool b2 = false;                        //bool类型的变量 可以用 false 和 true 赋值 
bool b3 = 10;                           //bool类型的变量也可以赋值数字 
bool b4 = 0; bool b5 = -10;             //0为假 非0为真 (即使是负数,也为真) 

cout<<"bool_size : "<<sizeof(b1)<<endl; //bool类型大小为 1 字节 
cout<<"b1 : "<<b1<<endl;                //输出bool变量的值 输出时, 
cout<<"b2 : "<<b2<<endl;                //真为 1 假为0 
cout<<"b3 : "<<b3<<endl; 
cout<<"b4 : "<<b4<<endl; 
cout<<"b5 : "<<b5<<endl; 
cout<<"b5 : "<<boolalpha<<b5<<endl;     //以字母的形式输出(true和false) 
                                        //一旦设置后,后面的输出全是字母类型 
cout<<"b2 : "<<b2<<endl; 
cout<<"b5 : "<<noboolalpha<<b5<<endl;   //改回以 0 1 的方式输出 
                                        //一旦设置后,后面的输出全是0 1 方式 
cout<<"b2 : "<<b2<<endl; 
bool sex = 0;                           //女 
cout<<"sex:"<<(sex?"帅哥":"美女")<<endl; //bool变量用在三目运算符中
 
return 0; 

}

五、引用(quote)

1.概念:

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

2.定义引用:

& 引用的声明符

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

例:

#include <cstdio> 

int main(){ 

    int a = 100; 
    int &b = a; 
    cout<<"a : "<<a<<endl;//100 
    cout<<"b : "<<b<<endl;//100 
    printf("&a : %p\n",&a);// 
    printf("&b : %p\n",&b);//和a的地址相同 
    return 0; 

}

使用引用的要求:

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

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

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

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

例1:引用变量

#include <iostream> 
using namespace std; 

void function(int &aa){ 

    aa = 200; 

} 

int main(){ 

    int a = 100; 
    cout<<"a:"<<a<<endl; 
    function(a); 
    cout<<"a:"<<a<<endl; 
    return 0; 

}

例2:引用指针

#include <iostream> 
using namespace std; 
#include <cstdio> 
#include <cstdlib> 

void function(int* &aa){ 

    aa = (int *)malloc(sizeof(int)); 
    
} 

int main(){ 
    
    int *p = NULL; 
    function(p); 
    *p = 100; 
    cout<<*p<<endl; 
    return 0; 

}

4.常引用

int main(){ 

    int a = 100; 
    const int &q = a; 
    a = 200;            //正确的,可以通过a修改值 
    q = 200;            //错误的,q是被const修饰的引用(是只读的) 
                        //不能通过q修改值 
    const int &q1 = 200;//const修饰的引用 可以引用常量 
    return 0; 

}

5.引用做函数的返回值

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

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

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

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

#include <iostream> 
using namespace std; 

const int &find_max(int x,int y){ 

    static int temp = x>y?x:y; 
    return temp; 

} 

int main(){ 

    int ret = 5; 
    find_max(10,20) = ret;    //如果返回的不是const 修饰的引用, 
                              //那么此处函数的返回值可以被修改 
    return 0; 

}

6.结构体中定义引用:

struct __STU{ 

    int &q; 

}; 

int main(){ 

    int a = 100; 
    struct __STU s1;        //错误 
    struct __STU s2 = {a};  //如果结构体中有引用成员,定义变量时,必须初始化 
    return 0; 

}

引用和指针的区别?

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

  • 6
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值