c++是面向对象、泛型编程。
1、 第一个c++程序:
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
//cout代表终端输出设备 endl换行
cout << "Hello World! " << endl;
cout << 100 << endl;
std::cout<< 'h' << endl;
//cin代表终端输入设备
int num;
//scanf("%d",%num) c语言的输入
std::cin >> num;
cout<<"num = "<<num<<endl;
return 0;
}
2、面向过程和面向对象
1、面向过程:
面向过程是一种以过程为中心的编程思想,其原理就是将问题分解成一个一个详细的步骤,然后通过函数实现每一个步骤,并依次调用。
面向过程我们所关心的是解决一个问题的步骤,举个例子,汽车发动、汽车熄火,这是两个不同的事件,对于面向过程而言,我们关心的是事件本身,因此我们会使用两个函数完成以上两个动作,然后依次调用即可。程序=数据结构+算法
算法:对数据的操作步骤(查找、排序)
2、面向对象:
面向对象则是一种以对象为中心的编程思想,就是通过分析问题,分解出一个一个的对象,然后通过不同对象之间的调用来组合解决问题。建立对象的目的不是为了完成某个步骤,而是为了描述某个事物在解决整个问题的过程中的行为。
如上面的例子,汽车发动、汽车熄火,对于面向对象而言,我们则关心的是汽车这类对象,两个事件只是这类对象所具备的行为。对象 = 算法 + 数据结构 程序 = 对象 + 对象 + ……
3、c++的三大特性:封装、继承、多态
封装
将数据和方法封装在一起,加以权限区分,用户只能通过方法操作自身的数据。 数据:成员数据 方法:成员函数
继承
继承所表达的是类之间相关的关系,这种关系使得对象可以继承另外一类对象的 特征 和能力。 继承的作用:避免公用代码的重复开发,减少代码和数据冗余
多态
多态性可以简单地 概括为“一个接口,多种方法”,字面意思为多种形态。程序在运 行时才决定调用的函数,它是面向对象 编程领域的核心概念。
c++对c的扩展之::
1、作用域运算 :: (解决的是 归属问题)
如果局部和全局同名 可以直接访问全局变量
#include <iostream>
using namespace std;
int a = 10;
void tets()
{
int a = 20;
cout<<"局部变量:a = "<<a<<endl;
//::a显示使用全局变量
cout<<"全局变量:a = "<<::a<<endl;
}
int main(int argc, char *argv[])
{
tets();
return 0;
}
c++对c的扩展之命名空间
在c++中,名称(name)可以是符号常量、变量、函数、结构、枚举、类和对象等等。工程越大,名称互相冲突性的可能性越大。另外使用多个厂商的类库时,也可能导致名称冲突。为了避免,在大规模程序的设计中,以及在程序员使用各种各样的C++库时,这些标识符的命名发生冲突,标准C++引入关键字namespace(命名空间/名字空间/名称空间),可以更好地控制标识符的作用域。
1、命名空间的定义
namespace 命名空间名
{
//打包的数据 和 函数
}
#include <iostream>
using namespace std;
namespace A{
int data1 = 10;
}
namespace B{
int data1 = 20;
}
int main(int argc, char const *argv[])
{
//加作用域 是最安全最简单的方法
cout<<" data = "<<A::data1<<endl; //10
cout<<" data = "<<B::data1<<endl; //20
return 0;
}
2、命名空间只能全局范围内定义(以下错误写法)
3、命名空间可嵌套命名空间
#include <iostream>
using namespace std;
namespace A{
int a = 10;
namespace B{ //命名空间嵌套
int a= 20;
}
}
int main(int argc, char const *argv[])
{
cout<<"A::a : "<<A::a<<endl;
cout<<"A::B::a : "<<A::B::a<<endl;
return 0;
}
4、命名空间是开放的,即可以随时把新的成员加入已有的命名空间中
#include <iostream>
using namespace std;
namespace A{
int a = 10;
}
namespace A{
void func()
{
cout<<"hello namespace!"<<endl;
}
}
int main(int argc, char const *argv[])
{
cout<<"A::a :"<<A::a<<endl;
A::func();
return 0;
}
5、声明和实现可分离
#include <iostream>
using namespace std;
namespace C{
int a;
void set_a(int data);
int get_a();
}
void C::set_a(int data)
{
a = data;
return;
}
int C::get_a()
{
return a;
}
int main(int argc, char const *argv[])
{
C::set_a(100);
cout<<"a = "<<C::get_a()<<endl;
return 0;
}
6、无名命名空间
无名命名空间里面的数据和方法 只能在当前源文件使用 就类似加static修饰
#include <iostream>
using namespace std;
namespace{
int a = 10;
void func()
{
cout<<"hello namespace!"<<endl;
}
}
int main(int argc, const char** argv) {
cout<<"a : "<<a<<endl;
func();
return 0;
}
内部连接:只在当前源文件用
外部连接:可以在其他源文件使用
7、命名空间别名
#include <iostream>
using namespace std;
namespace veryLongName{
int a = 10;
void func()
{
cout<<"hello namespace"<<endl;
}
}
int main(int argc, char const *argv[])
{
namespace newName = veryLongName;
cout<<"veryLongName::a :"<<newName::a<<endl;
veryLongName::func();
newName::func();
return 0;
}
8、using 是修饰 命令空间 里面的 某些数据或方法
#include <iostream>
using namespace std;
namespace D{
int a = 10;
}
int main(int argc, char const *argv[])
{
//下列出现的a来自D命名空间
using D::a;
//防止同名 否则报错
//int a = 20;
cout<<"a = "<<a<<endl;
return 0;
}
9、using声明碰到函数重载
#include <iostream>
using namespace std;
namespace A{
void func(){}
void func(int x){}
void func(int x,int y){}
}
int main(int argc, char const *argv[])
{
//下列出现的func来自A命名空间
using D::func;
func();
func(10);
func(10,20);
return 0;
}
如果命名空间包含一组用相同名字重载的函数,using声明就声明了这个重载函数的所有集 合
10、using 是修饰 整个命名空间
#include <iostream>
using namespace std;
namespace D{
int a = 10;
int b = 20;
int c = 30;
}
int main(int argc, char const *argv[])
{
//声明识别整个命名空间 里的数据和方法
using namespace D;//强调的是命名空间名
//先查看当前普通变量a 如果没有 再查看命名空间中有没有a
cout<<"a = "<<a<<endl; //10
//不会冲突
int a = 100;
cout<<"a = "<<a<<endl;//100就近原则
return 0;
}