目录
类的引入与访问控制
在C语言中可以用struct来类比一个对象,但是struct比较局限,不能像C++可以有自己的成员函数并且可以访问内部成员,在C++中用class来定义一个类,因此struct和class的区别就在于struct不可以含有成员函数而C++可以,对于struct和class的主要区别在于默认的存取权限不同,struct默认是public,而class默认是private,在下面之所以将变量设置为私有属性,是保护一些重要的特性,避免用户做出错误的操作
-
class Person {
-
private:
-
char *name;
-
int age;
-
char *work;
-
-
public:
-
void setName(char *n)
-
{
-
name = n;
-
}
-
int setAge(int a)
-
{
-
if (a <
0 || a >
150)
-
{
-
age =
0;
-
return
-1;
-
}
-
age = a;
-
return
0;
-
}
-
void printInfo(void)
-
{
-
printf(
"name = %s, age = %d, work = %s\n", name, age, work);
-
}
-
};
权限
对于private表示这些变量和函数只能在内部被使用,public表示类外的程序可使用,还有一种protected,对于private和protected的区别,后面再学习
类中属性 | private | protected | public |
内部可见性 | 可见 | 可见 | 可见 |
外部内可见性 | 不可见 | 不可见 | 可见 |
定义一个类之后,我们怎么去使用,对于上述类,我们可以用"Person per"来使用,在C++我们称per为Person这个类的对象,由于class中的private为私有成员,因此"per.name = "zhangsan";"在外部直接访问对象中私有成员会出错,利用此对象与C结构体一样
-
int main(int argc, char **argv)
-
{
-
Person per;
-
// per.name = "zhangsan";
-
per.setName(
"zhangsan");
-
per.setAge(
200);
-
per.printfInfo();
-
-
return
0;
-
}
this
在类中通过提供函数来设置私有变量,当局部变量与类成员名字冲突时,可以通过术语this来表示,而this实质为一个指针,在C++中有一个就近原则,如下例子中,对于this->name为类中的name,而变量name与形参更近则表示传参的name
-
class Person {
-
private:
-
char *name;
-
int age;
-
char *work;
-
-
public:
-
void setName(char *name)
-
{
-
this->name = name;
-
}
-
int setAge(int age)
-
{
-
if (age <
0 || age >
150)
-
{
-
this->age =
0;
-
return
-1;
-
}
-
this->age = age;
-
return
0;
-
}
-
void printInfo(void)
-
{
-
printf(
"name = %s, age = %d, work = %s\n", name, age, work);
-
}
-
};
对于类中的函数成员可以只声明而不定义其函数体,在外部可以通过::引用来定义类中的函数
-
class Person {
-
private:
-
char *name;
-
int age;
-
char *work;
-
-
public:
-
void setName(char *name);
-
int setAge(int age);
-
void printInfo(void);
-
};
-
-
void Person::setName(char *name)
-
{
-
this->name = name;
-
}
-
-
int Person::setAge(int age)
-
{
-
if (age <
0 || age >
150)
-
{
-
this->age =
0;
-
return
-1;
-
}
-
this->age = age;
-
return
0;
-
}
-
-
void Person::printInfo(void)
-
{
-
printf(
"name = %s, age = %d, work = %s\n", name, age, work);
-
}
程序结构
对于一个程序分多个人写,假设有两个人A和B,对于A来说写main.cpp,他只关心怎么用Person这个类,对于B来说为写Person这个类,只需要提供Person.h和Person.cpp给main.cpp使用,如果后面来个新人C假设写一个dog类,跟B一样的任务
B负责person.cpp和person.h
-
/person.cpp/
-
#include <stdio.h>
-
#include "person.h"
-
-
namespace A {
-
-
void Person::setName(char *name)
-
{
-
this->name = name;
-
}
-
-
int Person::setAge(int age)
-
{
-
if (age <
0 || age >
150)
-
{
-
this->age =
0;
-
return
-1;
-
}
-
this->age = age;
-
return
0;
-
}
-
-
void Person::printInfo(void)
-
{
-
printf(
"name = %s, age = %d, work = %s\n", name, age, work);
-
}
-
-
void printVersion(void)
-
{
-
printf(
"Person v1, by weidongshan\n");
-
}
-
-
}
-
-
/person.h/
-
#include <stdio.h>
-
-
namespace A {
-
-
class Person {
-
private:
-
char *name;
-
int age;
-
char *work;
-
-
public:
-
void setName(char *name);
-
int setAge(int age);
-
void printInfo(void);
-
};
-
-
void printVersion(void);
-
}
C负责dog.cpp和dog.h
-
/dog.cpp/
-
#include <stdio.h>
-
#include "dog.h"
-
-
namespace C {
-
-
void Dog::setName(char *name)
-
{
-
this->name = name;
-
}
-
-
int Dog::setAge(int age)
-
{
-
if (age <
0 || age >
20)
-
{
-
this->age =
0;
-
return
-1;
-
}
-
this->age = age;
-
return
0;
-
}
-
-
void Dog::printInfo(void)
-
{
-
printf(
"name = %s, age = %d\n", name, age);
-
}
-
-
void printVersion(void)
-
{
-
printf(
"Dog v1, by weidongshan\n");
-
}
-
-
}
-
-
-
/dog.h/
-
namespace C {
-
-
class Dog {
-
private:
-
char *name;
-
int age;
-
public:
-
void setName(char *name);
-
int setAge(int age);
-
void printInfo(void);
-
};
-
-
void printVersion(void);
-
-
}
namespace
上述代码中对于B和C两个的类成员外都有一个版本打印函数并且函数名字相同,对于C语言和C++来说这么写会冲突,但是C++可以避免这种问题,引出命名空间的概念"namespace",对于A写main.cpp的人来说,可以通过::来引用命名空间的同名的函数
-
#include <stdio.h>
-
#include "person.h"
-
#include "dog.h"
-
-
int main(int argc, char **argv)
-
{
-
A::Person per;
-
per.setName(
"zhangsan");
-
per.setAge(
16);
-
per.printInfo();
-
-
C::Dog dog;
-
dog.setName(
"wangcai");
-
dog.setAge(
1);
-
dog.printInfo();
-
-
A::printVersion();
-
C::printVersion();
-
return
0;
-
}
using
利用using来使用namespace,对于"using A::Person;",把A::Person放入global namespace, 以后就可以使用Person来表示"A::Person",在main函数中就是local namespace,因此"Person per"前提需要using来包含命名空间
-
#include <stdio.h>
-
#include "person.h"
-
#include "dog.h"
-
-
using A::Person;
-
using C::Dog;
-
-
using A::printVersion;
-
using C::printVersion;
-
-
int main(int argc, char **argv)
-
{
-
/* local namespace */
-
//using A::Person;
-
//using C::Dog;
-
-
Person per;
-
per.setName(
"zhangsan");
-
per.setAge(
16);
-
per.printInfo();
-
-
Dog dog;
-
dog.setName(
"wangcai");
-
dog.setAge(
1);
-
dog.printInfo();
-
-
A::printVersion();
-
C::printVersion();
-
return
0;
-
}
使用"using namespace A" 把命名空间全部包含进来,把空间内所有的都导进来,两个都导进来之后就必须指定冲突函数的空间,但是对于printVersion,一样都需要"A::printVersion"来区别调用,当有冲突的函数里面直接使用命名函数就可以了,所以包含namespace也是一样的道理
-
using
namespace A;
-
using
namespace C;
-
-
int main(int argc, char **argv)
-
{
-
/* local namespace */
-
//using A::Person;
-
//using C::Dog;
-
-
Person per;
-
per.setName(
"zhangsan");
-
per.setAge(
16);
-
per.printInfo();
-
-
Dog dog;
-
dog.setName(
"wangcai");
-
dog.setAge(
1);
-
dog.printInfo();
-
-
A::printVersion();
-
C::printVersion();
-
return
0;
-
}
cout
在C++中一般用cout来打印,cout是标准std命名空间,需要定义iostream头文件
-
#include <iostream>
-
-
using
namespace
std;
-
-
void Person::printfInfo(void){
-
// printf("name = %s, age = %d, work = %s\n", name, age, work);
-
cout<<
"name = "<<name<<
" age = "<<age<<
" work = "<<work<<
endl;
-
}
-
-
void printVersion(void)
-
{
-
// printf("Person v1, by xiaoma\n");
-
cout<<
"Person v1, by xiaoma"<<
endl;
-
-
}
-
-
-
//若没有包含命名空间std,则可以用::来引用
-
void Person::printfInfo(void){
-
std::
cout<<
"name = "<<name<<
" age = "<<age<<
" work = "<<work<<
std::
endl;
-
}
-
-
void printVersion(void)
-
{
-
std::
cout<<
"Person v1, by xiaoma"<<
std::
endl;
-
-
}
转载:https://blog.csdn.net/weixin_45775710/article/details/117195871