您的位置:首页 > 编程语言 > C语言/C++

c++ 学习之路 第一天 C++类和对象,命名空间,标准库和std命名空间

2016-07-20 16:52 876 查看

一.类和对象的概念

类 :C++中的类是一种用户定义的类型,可以理解为C语言中的结构体的升级版。

对象 :C++中的类也是一种构造数据类型,但是进行了一些扩展,类的成员不但可以是变量,还可以是函数;通过类定义出来的变量就叫做对象。下面给出一段示例代码:

#include<stdio.h>
int main(void){
class Student{
public:
char *name;
int age;
float score;

public:
int printInfo(void){
printf("%s age is:%d,score is %f",name,age,score);
}
};

class Student stu1;
stu1.name="kelvin";
stu1.age=20;
stu1.score=100.0;
stu1.printInfo();
return 1;
}


这段代码中,class用于声明一个类,public表示该成员是共有的,“共有”是指这个类创建出的对象都可以访问该成员,与之相对就会有private,正与public相反。

C++中,通过类可以创建对象,类可以看做模板,通过模板可以生产出具有相同性质的产品,因此也将对象成为类的一个实例,这个过程称为类的实例化。

注意:类只是一个模板,起到指导的作用,不占用内存空间;对象才是具体的产品,要有地方来存放,才会占用内存空间。

类所包含的变量和函数也有了新的的称呼,变量被称为属性(通常也称成员变量),函数被称为方法;属性和方法统称为类的成员。

二.命名空间

C++语言引入命名空间(Namespace)这一概念主要是为了避免命名冲突,其关键字为namespace。

一个较大的项目在开发过程中,会有很多人参与,不可避免地会出现变量,函数重名的情况。每个人的代码单独运行都没有问题,但合并在一起时就出现了问题,所以引入了namespace的概念。

//那么命名空间是如何解决问题的呢,我们来看这样一段code.
int  flag = 1;      //A声明的变量
// ……             //中间间隔若干行代码
bool flag = true;   //B声明的变量


每个人习惯不同,有人喜欢用0,1做逻辑判断,有人喜欢用布尔值。于是我们用namespace来解决冲突的问题。

namespace A{   //A的变量声明
int flag = 1;
}
namespace B{   //B的变量声明
bool flag = true;
}


A和B分别用姓名来指定各自的命名空间,这样两个flag变量再放进同一个函数体里就不会有冲突。当然得说明是哪个namespace里的flag。于是,为了说明变量属于哪个namespace,有了 域解析操作符 ::

A::flag = 0;        //使用A定义的变量flag
B::flag = false;   //使用B定义的变量flag


除了直接使用域解析操作符,还可以使用 using 关键字

using A::flag;
flag = 0;  //使用A定义的变量flag
B::flag = false;  //使用B定义的变量flag


代码开头用using声明使用A定义的flag,表示之后的代码在未指定namespace时都使用A定义的flag,但要使用B定义的flag时,还是要用 :: 来指定namespace。

命名空间内部不仅可以声明或定义变量,对于其它能在命名空间以外声明或定义的实体,同样也都能在命名空间内部进行声明或定义,例如类的声明或定义、函数的声明或定义、typedef等都可以出现在命名空间中。

给出namespace示例代码如下:

#include<stdio.h>
namespace kelvin{
class Student{
public:
char *name;
int age;
float score;

public:
int printInfo(void){
printf("%s age is:%d,score is %f",name,age,score);
}
};
}

int main(void){
using namespace kelvin;
class Student stu1;
stu1.name="kelvin";
stu1.age=20;
stu1.score=100.0;
stu1.printInfo();
return 1;
}


三.C++标准库和std命名空间

使用C++标准头文件

前面我们使用了C语言的格式输出函数 printf,引入了头文件 stdio.h,这完全没有错误,因为C++兼容C。但在C++代码中我还是推荐使用C++的头文件,不要把C和C++代码混合在一起使用。

如果你希望使用 printf 函数,那么应该引入 ,并使用命名空间 std,如下所示:

#include <cstdio>
using namespace std;


通过两个函数和解析,命名空间就能理解清晰**

使用std这个名字空间。标准库里面的东西都是处于std名字空间的。

解析程序一:

#include <iostream>
using namespace std;

namespace class1{
int zhangsan=100;
namespace group1{
int lisi =500;
};
};
namespace class2{
int zhangsan=200;
};
//命名空间就是一个作用域
//包括一个类、函数、语句块都是一个作用域,典型语法符号就是指{};
using namespace class1;
using namespace class2;

int zhangsan =300;

int main()
{
cout<<"Hello world!"<<endl;
//::,域访问符,指的是前面的作用域内取访问某些变量或符号
cout<<"class1::zhangsan="<<class1::zhangsan<<endl;
cout<<"class2::zhangsan="<<class2::zhangsan&
c142
lt;<endl;
cout<<"::zhangsan="<<::zhangsan<<endl;
cout<<"class1::group1::lisi="<<class1::group1::lisi<<endl;
return 0;
}


**using namespace std;

如果不写这句,

你写cin和cout时候就必须这样写,否则找不到cin或者cout。

std::cin>>a;

std::cout << a << std::endl;

//////////////

解析程序二:

#include <iostream>
using namespace std;

namespace class1{
int zhangsan=100;
namespace group1{
int lisi =500;
};
};
#if 0
namespace class2{
int zhangsan=200;
};
#endif
//命名空间就是一个作用域
//包括一个类、函数、语句块都是一个作用域,典型语法符号就是指{};
//using namespace class1;
using namespace class1::group1;

//int zhangsan =300;

int main()
{
cout<<"Hello world!"<<endl;
//::,域访问符,指的是前面的作用域内取访问某些变量或符号
//  cout<<"zhangsan="<<zhangsan<<endl;
cout<<"lisi="<<lisi<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  namespace class c++学习