C++基础学习笔记

C++基础学习笔记

1.C++基础知识

一.C++发展过程
–》1998,ISO C++98
–》2003,ISO C++03
–》2011,ISO C++11
–》2014,ISO C++14
–》2017,ISO C++17
–》2020,ISO C++20

#include <iostream>  
//#include <stdio.h>//C风格  
#include <cstdio>//C++风格  
int main(void){  
    std::cout << "hello world!" << std::endl;  
    printf("hello world!\n");  
    return 0;  
}

1 编译方式
1)gcc xx.cpp -lstdc++
2)g++ xx.cpp //推荐
2 文件扩展名.cpp //推荐
3 头文件

#include <iostream>

C++中和I/O相关的类型、对象、函数都在在头文件中
C++中大多数头文件没有".h"后缀
注:在C++中开发中,依然可以使用标准C库的头文件,另外在C++中还提供一套不带“.h”替换版本.

#include <stdio.h> ==> #include <cstdio>
#include <stdlib.h> ==> #include <cstdlib>
#include <string.h> ==> #include <cstring>

4 C++中标准输入和输出
1)cin对象表示标准输入//类似scanf

int num=0;
scanf("%d",&num);//C语言
cin >> num;//C++语言
注:“>>”被称为输入(提取)操作符
//从键盘同时读取一个int和一个double数据
int i=0,double d = 0.0;
scanf("%d%lf",&i,&d);//C语言
cin >> i >> d;//C++语言

2)cout对象表示标准输出//类似printf

int num = 123;
printf("%d\n",num);//C语言
cout << num << endl;//C++语言
注:“<<”被称为输出(插入)操作符
注:“endl”表示换行和"\n"类似
//同时打印输出一个int数据和一个double	
int i=100,double d=1.23;
printf("%d,%lf\n",i,d);//C语言
cout << i << ',' << d << endl;//C++语言

三 命名空间
1 作用
1)避免名字冲突
2)划分逻辑单元
2 定义

namespace 名字空间名{
	名字空间成员1;
	名字空间成员2;
	...
}
注:名字空间成员可以是全局函数、全局变量、类型、名字空间.

3 名字空间成员使用
1)作用域限定操作符"::"
名字空间名::要访问的成员;

std::cout //指定访问标准名字空间里面的cout

2)名字空间指令
using namespace 名字空间名;
注:在该条指令以后的代码中,指定名字空间的成员都可见,可以直接访问,省略"名字空间名::".

using namespace std;
cout << a;//ok

3)名字空间声明
using 名字空间名::名字空间成员;
注:将名字空间中特定的一个成员引入到当前作用域,在该作用域访问这个成员就如同访问自己的局部成员一样,可以直接访问,省略"名字空间名::"

4 全局作用域和匿名名字空间//了解
1)没有放在任何名字空间的成员属于全局作用域,可以直接访问,但如果和局部作用域的成员名字一样,局部优先;这时如果还希望访问全局作用域的成员可以通过“::xx”显式访问。
2)定义名字空间时可以没有名字,即为匿名名字空间,匿名空间中成员和全局作用域类似,可以直接访问,也可以通过"::xx"显式的访问,唯一的区别匿名空间的成员被局限在当前文件中使用

5 名字空间的嵌套与合并//了解
1)名字空间嵌套

namespace ns1{
	int num = 100;
	namespace ns2{
		int num = 200;
		namespace ns3{
			int num = 300;
		}
	}
} 
cout << ns1::num << endl;//100
cout << ns1::ns2::num << endl;//200
cout << ns1::ns2::ns3::num << endl;//300

2)名字空间合并:两个同名的空间会自动合并成一个
namespace ns{//1.cpp
void func1(void){…}
}
namespace ns{//2.cpp
void func2(void){…}
}

#include <iostream>  
namespace ns1{  
    void func(void){  
        std::cout << "ns1的func" << std::endl;  
    }  
}  
namespace ns2{  
    void func(void){  
        std::cout << "ns2的func" << std::endl;  
    }  
}  
int main(void){  
    //名字空间成员不能直接访问  
    //func();//error  
    //可以通过作用域限定符"::"访问  
    ns1::func();  
    ns2::func();  
    return 0;  
} 

#include <iostream>  
//标准名字空间指令,省略“std::”  
using namespace std;  
namespace ns1{  
    void func(void){  
       cout << "ns1的func" << endl;  
    }  
}  
namespace ns2{  
   void func(void){  
        cout << "ns2的func" << endl;  
   }  
}  
int main(void){  
    using namespace ns1;//名字空间指令  
   func();//ns1的func  
   using namespace ns2;//名字空间指令  
    //func();//歧义错误  
    ns2::func();  
 
   return 0;  
}  
///
#include <iostream>  
//标准名字空间指令,省略“std::”  
using namespace std;  
namespace ns1{  
   void func(void){  
        cout << "ns1的func" << endl;  
   }  
}  
namespace ns2{  
    void func(void){  
        cout << "ns2的func" << endl;  
   }  
}  
int main(void){  
    using ns1::func;//名字空间声明  
    func();//ns1的func  
   //using ns2::func;  
    //func();//歧义错误  
    using namespace ns2;//名字空间指令  
    func();//ns1的func,局部优先  
    ns2::func();//ns2的func  
  
  
    return 0;  
} 

#include <iostream>  
using namespace std;  
namespace ns1{  
   int num = 100;  
}  
namespace ns2{  
    int num = 200;  
}  
//int num = 300;//全局作用域  
namespace {//匿名名字空间  
    int num = 300;  
}  
int main(void){  
    cout << num << endl;//300  
    using ns1::num;//名字空间声明  
    cout << num << endl;//100,局部优先  
    cout << ns2::num << endl;//200  
    cout << ::num << endl;//300  
    return 0;  
}  

四 C++的结构体、联合体和枚举
1 C++的结构体
1)当定义结构体变量时可以省略struct关键字
2)在C++的结构体内部可以直接定义函数,称为成员函数(方法),在成员函数内部可以直接访问结构体的其它成员.

#include <iostream>  
using namespace std;  
struct Teacher{  
   //成员变量  
    char name[20];  
    int age;  
    double salary;  
    //成员函数  
    void who(void){  
        cout << "我叫" << name << ",今年" <<  
            age <<"岁,工资是" << salary<<endl;  
    }  
};   
int main(void){  
    Teacher youcw={"游成伟",35,800.5};  
    youcw.who();  
    Teacher* pt = &youcw;  
    pt->who();//(*pt).who()  
    return 0;  
}  

2 联合体//了解
1)当定义联合体变量时可以省略union关键字
2)在C++中支持匿名联合

#include <iostream>  
using namespace std;  
int main(void){  
    union{//匿名联合  
        unsigned int ui  ;  
        unsigned char uc[4];  
    };  
    ui = 0x12345678;  
    //如果当前是小端字节序,下面输入结果?  
   for(int i=0;i<4;i++){  
        //hex:表示以16进制方式打印整数  
        //showbase:显示"0x"  
       cout << hex << showbase << (int)uc[i]  
            << endl;  
    }  
    return 0;  
 }

3 枚举
1)当定义枚举变量时可以省略enum关键字
2)C++中枚举被看作是独立数据类型,不能把枚举直接当做整型数来使用.

	enum STATE{SLEEP=0,RUN=1,STOP=2};
	/*enum*/ STATE s;
	s = RUN;//C:ok C++:ok
	s = 1;//C:ok C++:error
#include <iostream>  
using namespace std;  
int main(void){  
   enum Color{RED=10,BLUE,GREEN};  
   cout << RED << "," << BLUE << "," <<   
       GREEN << endl;  
   /*enum*/ Color c;  
   //c = 10;//C:ok,C++:error  
    c = RED;//C:ok,C++:ok  
    cout << c << endl;//10  
    return 0;  
}  

五 C++的字符串
1 回顾C语言中的字符串
1)字面值常量字符串: “XX”
2)字符指针:char*
3)字符数组:char[]

2 C++兼容C风格的字符串,同时增加了string类型,专门字符串:
1)定义
string s1;//定义空字符串
string s2 = “xx”;//定义同时初始化
2)字符串拷贝:=
string s1 = “youcw”;
string s2 = “mindasheng”;
s1 = s2;//将s2拷贝给s1
cout << s1 << endl;//“mindasheng”
3)字符串连接:+ +=
string s1 = “hello”;
string s2 = " world";
string s3 = s1 + s2;
cout << s3 << endl;//“hello world”
4)字符串比较:== != > >= < <=
if(s1 == s2){…}
5)随机访问: []
string s = “minwei”;
s[0] = ‘M’;
s[3] = ‘W’;
cout << s << endl;//MinWei
6)暂时可以string理解为是"结构体"类型,里面包含了很多成员函数,常用的:
size()/length();//获取字符串长度
c_str();//返回字符串的起始地址(const char*)
eg:
string str = “youcw”;
str.size();//5
str.length();//5和size()等价
string s1 = “hello”;//C++风格
const char* s2 = “world”;//C风格

s1 = s2;//ok
s2 = s1;//error
s2 = s1.c_str();
#include <iostream>  
using namespace std;  
int main(void){  
    string str;  
    int count = 0;  
    cout << "Please input a string:" << endl;  
    cin >> str;  
   for(int i=0;i<str.size();i++){  
        if(str[i]=='y' || str[i]=='Y'){  
            ++count;  
       }  
    }  
    cout << "Y/y count:"  << count << endl;  
    return 0;  
} 

#include <iostream>  
using namespace std;  
int main(void){  
    string str;  
    cin >> str;  
    int len = str.size();  
    //abcdef  
    //fedcba  
   for(int i=0;i<len/2;i++){  
        str[i] = str[i] ^ str[len-i-1];  
        str[len-i-1] = str[i] ^ str[len-i-1];  
        str[i] = str[i] ^ str[len-i-1];  
   }  
    cout << str << endl;  
    return 0;  
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值