目录
前言
本篇文章主要总结了,c++的环境安装、配置;标准输入输出、命名空间的不同情况;同时初步比较了C语言与C++的区别;引用和动态内存分配、类的初步认知(定义、创建、调用);面向对象的3大特性之一的封装性,函数的分文件定义与实现
提示:以下是本篇文章正文内容,下面案例可供参考
一、环境安装
1.1 Linux安装
g++编译器编译C++代码,不能使用gcc
在用户目录中单独创建一个文件夹存放下载后的3个安装文件,然后进入到目录中执行下面命令
//cd 到放的目录下 例:cd ~/Desktop
sudo dpkg -i *.deb 命令安装
sudo apt -get install g++ 在线安装
sudo apt -get remove g++ 卸载之前的版本
***拖拽虚拟机失败******
解决办法:
虚拟机设置共享文件夹
管理 --》虚拟机设置 --》选项 --》添加共享文件夹 如:c++-soft
1.2 QT环境安装
注意:路径不能有中文
IDE 集成开发环境
QTCreator eclipse vs
在IDE中写代码,首先创建项目
QTCreator会对整个项目中的所有文件进行编译!!!!!
中文乱码:
解决方式,工具--》选项--》文本编辑器 行为--》默认编码 改为System,然后重启Qt即可。
1.3 工程简介
1、新建项目
2、运行项目
二、标准输入输出、命名空间
2.1 标准输入流、输出流对象
#include <iostream> //流 数据流 从A点移动到B点,以字节或者字符为单位移动
int main()
{
//在这里<<不是移位的运算,被重新赋予了新的含义,就是把右边的内容放到输出流对象里。
std::cout<<" hello world !"<<std::endl; //等价于printf(“hello world\n”);
return 0;
}
编译:g++ test.cpp -o test
运行:./test
程序解释:
#include<iostream> 输入输出头文件
std 命名空间 //c++所有的类和对象的名字都是std的命名空间,避免命名空间污染
cout 输出流 格式: cout<<数据
<< 输出流运算符 endl 换行 \n end line
:: c++才有的运算符 作用域限定符
cin 输入流 无法输入空格 如果输入有空格 只拿到空格之前的
>> 运算符重载,指向了数据流的方向
输入输出流都可自动识别内置类型,较C语言比较方便
cin可获取多个输入,每次遇到空格停止
getline输入字符串 读入一行的字符串,包括空格,遇到'\n'结束输入
2.2 系统自带、自定义、匿名命名空间
命名空间作用:避免命名空间污染(避免同名冲突)
注意:C++语言只有一个命名空间std,C++定义的所有的类和对象都是std这个命名空间下的命名的
类型一:系统标准命名空间std
方法一:整体声明,打开命名空间 using namespace std;
方法二:只声明要使用的 using std::cout; using std::cin;
类型二:自定义命名空间
定义:namespace + 命名空间的名字
例如:
namespace teacher //1.定义命名空间 teacher
{
char name[20] = "小明";
}
using namespace teacher;
使用方法和标准命名空间调用方法相同
命名空间冲突,即访问不明确的情况
1.两个命名空间定义了同一个变量时,造成访问不明确,所以必须规范使用 命名空间 ::变量名
2.命名空间于调用者内部变量产生冲突,则优先使用内部变量
3.全局变量和空间中变量冲突时,全局变量被放到匿名命名空间中 ::变量名
int a = 10;
int main()
{
int a = 20;
cout<<a<<endl; //20
cout<<::a<<endl; //10 通过匿名对象方式访问全局变量
return 0;
}
三、C++与C比较
C面向过程 C++面向对象
1) 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,
使用的时候一个一个依次调用就可以了。
2) 面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙 某个事物在整个解决问题的步骤中的行为。
3.1 字符串处理函数
1、c 用字符数组存储 用字符指针操作
C语言字符串的两个要素:1. '\0'结尾 2. 字符类型的地址 //首地址
2、c++ 标准库中string类 (string不是基本类型,是类类型、对象类型)
C++的字符串处理函数
(1)需要加头文件#include<string>
string是C++的头文件,不是C语言的头文件,和string.h不是一回事
(2)需要加std命名空间 using namespace std;
(3)赋值 连接 拷贝 比较 与算数运算符使用即可实现字符串处理功能
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1 = "hello world"; //s1是string类型的对象,用字符串”hello world”初始化
string s2("hello farsight");//s2是string类型的对象,用字符串”hello farsight”初始化
string s3(s2);//s3是用s2复制的string类型对象
string s4 = s3;//s4是用s3复制的string类型对象
cout<<s1<<endl;//hello word
cout<<s2<<endl;//hello farsight
cout<<s3<<endl;//hello farsight
cout<<s4<<endl;// hello farsight
s4 +=s3;//拼接、连接
//注意:只接受string,如果需要拼接其他类型,只能使用sprintf()进行复杂的字符串格式化
cout<<s4<<endl;//hello farsighthello farsight
s4 ==s3;//比较 使用关系运算符 == != < > <= >= 返回值为bool类型 真true 假false
}
其他成员函数:empty() 和 size()
empty() 判断空,如果字符串是空,返回true
size() 返回字符串长度,算法和strlen是一样的。
风格类型转换:
(1) c风格转为c++风格 string s = "abvc";
(2) 将string转换成C风格字符串 c_str()函数:是将c++字符串s1转换为c风格字符串 char*
C++推荐我们使用string字符串,但是有些时候api的参数需要我们使用C风格字符串char* 类型的参数,这时候需要我们将string转换成C风格字符串。
3.2 bool类型
1、bool是基本数据类型(内置类型(基本数据类型),不需要声明就能使用的类型),用来表示逻辑真假。
2、C++依然可以使用0和非0表示真假,但C++增加bool类型专门表示真假true false
优点::bool类型能够增强程序可读性
bool类型所占类型数:至少1字节 boolalpha 字母形式输出 true
noboolalpha解除字母形式输出,换为数字形式输出
四、引用与动态内存分配
4.1 引用(常引用) 与指针
引用:是c++对c的重要扩充,引用符号:& 使用数据类型加引用符号&,声明引用。
引用变量是某个已存在变量的另一个名字 本质上是同一个变量,扩充作用域
引用类型, 主要是把它作为函数参数,以扩充函数传递数据的功能
引用的特点:
* 1.引用必须进行初始化,不可以单独的存在 int& b;错误的
* 2.引用不可以改变指向
* 3.普通的引用,不可以用常量或者临时值进行初始化 常引用可以(const)
*
引用和指针的区别:
1. 不存在空引用,引用必须连接到一块合法的内存;指针可以是空指针。
2. 一旦引用被初始化为一个对象,就不能被指向到另一个对象;指针可以在任何时候指向到另一个对象。
3. 引用必须在创建时被初始化;指针可以在任何时间被赋值。
引用可为参数、返回值 :
引用作为返回值,是返回变量本身,而不是一个临时的值,要保证变量的生命周期足够长。
const修饰的引用:常引用 做形参(作用:保护原变量,不被修改)
const 常量化 声明变量时,程序便不能再对它进行修改,即限定一个变量不允许被改变
const 与define的比较:
1、宏常量有数据类型,而const常量没有数据类型
2、有些集成化的调试工具可以对const 常量进行调试,但是不能对宏常量进行调试
3、编译器可以对const进行类型安全检查。而对#define只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。
4.2 new与malloc比较
不同的内存空间对变量的生命周期管理不同。
1.堆: 自定义生命周期 只申请不释放堆空间内存,内存泄漏。
2.栈: 作用域结束,变量就释放。
3.静态: 程序结束才释放。
c中 函数 malloc-free malloc申请的内存空间是没有类型的void* 不会初始化
c++中 关键字(运算符) new -delete new申请的内存空间是有类型的 给内存初始化
总结:new 与malloc的比较
1、malloc是库函数 new是关键字(运算符)
2、malloc申请的空间没有类型,需要强转 new根据指定类型申请并返回对应的指针类型
4.3 重载 默认参数
重载:在同一个类对象中,函数名相同,参数不同(参数类型、参数个数)满足一个即可
函数默认参数:
1、默认参数的顺序:形参列表只能从右侧开始有默认值,依次默认
2、加入默认值后:实参可以选择 传值或者不传值
3、当函数的声明和定义分开写的时候,只能在声明的部分写默认参数
五、类的初步
5.1 定义、创建、调用
1.定义类 :类class是以struct为基础,扩充而来
class + 类名
{
public:公有
};
2.创建类实例对象
类名 对象名;
3.调用类成员
对象名.属性;
对象名.函数();
5.2 堆、栈空间
//栈空间创建对象
int main()
{
//2.栈空间 创建(实例化)类对象
Person p;
//3.调用类成员 进行赋值
//p.name = "小明";
//4.调用成员函数 进行赋值
p.setName("小明");
//cout<<p.name<<endl;
p.show();
}
//堆空间创建对象
int main()
{
Student* p = new Student();//在堆空间创建一个Student类型的对象
p->setName("小明");
p->setAge(18);
p->print();
delete p;//删除对象
}
5.3 访问权限、封装性 、分文件定义类
class与struct的比较:
1、class 默认访问权限是私有的private的 struct默认是public的
2、class 有3种访问权限 public private protect struct只有一种
封装:函数封装 类封装 高内聚 低耦合
当一个函数太大的时候,函数本身一定可以再拆分成若干个小函数
当一个类太大的时候,要将他的相关功能的成员变量和成员函数拆分成若干个小类。
分文件定义类:将一个功能的声明、实现、函数调用分成不同的文件,提高可读性
总结
主要总结了,c++的环境安装、配置;标准输入输出、命名空间的不同情况;同时初步比较了C语言与C++的区别;引用和动态内存分配、类的初步认知(定义、创建、调用);面向对象的3大特性之一的封装性,函数的分文件定义与实现