1. C++程序的基本结构
先引入一个例子:
#include
class Person {
private:
char *name;
int age;
char *work;
public:
void setName(char*name);
int setAge(intage);
void printInfo(void);
};
void Person::setName(char *name)
{
this->name = name;
}
int Person::setAge(intage)
{
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);
}
int main(intargc, char **argv)
{
Person per;
//per.name = "zhangsan";
per.setName("zhangsan");
per.setAge(200);
per.printInfo();
return 0;
}
在上面的代码里,函数的声明是在写在类里面的,实现在类外部。在实际开发中,使用者更关心的是对外提供的接口函数,而并不关心内部实现,所以上述的代码可以拆分成头文件和源文件,头文件代表对外提供的访问接口,源文件里编写具体实现。所以上述程序可以通过以下步骤修改:拆分成头文件,源文件和主程序,编写Makefile对源码进行编译。
头文件:
#include
class Person {
private:
char *name;
int age;
char *work;
public:
void setName(char*name);
int setAge(intage);
void printInfo(void);
};
源文件:
#include
#include "person.h"
void Person::setName(char *name)
{
this->name = name;
}
int Person::setAge(intage)
{
if (age <0|| age > 150)
{
this->age= 0;
return-1;
}
this->age = age;
return0;
}
void Person::printInfo(void)
{
printf("name =%s, age = %d, work = %s\n",name, age, work);
}
主程序:
#include
#include "person.h"
int main(intargc,char **argv)
{
Person per;
//per.name ="zhangsan";
per.setName("zhangsan");
per.setAge(200);
per.printInfo();
return0;
}
Makefile:
person: main.o person.o
g++ -o $@ $^
%.o :%.cpp
g++ -c -o $@ $<
clean:
rm -f *.o person
2. 命名空间
C++命名空间可以避免在使用多方库时导致命名冲突,C++使用关键字namespace来标示各种标识符的作用域,由此解决不同作用域的标识符命名冲突问题。
dog.h
namespace C { class Dog { private: char *name; int age; public: void setName(char*name); int setAge(intage); void printInfo(void); }; void printVersion(void); }
dog.cpp
#include
#include "dog.h"
namespace C {
void Dog::setName(char*name)
{
this->name = name;
}
int Dog::setAge(intage)
{
if (age <0|| age > 20)
{
this->age= 0;
return-1;
}
this->age = age;
return0;
}
void Dog::printInfo(void)
{
printf("name =%s, age = %d\n",name, age);
}
void printVersion(void)
{
printf("Dog v1, by weidongshan\n");
}
}
person.h
#include
namespace A {
class Person {
private:
char *name;
int age;
char *work;
public:
void setName(char*name);
int setAge(intage);
void printInfo(void);
};
void printVersion(void);
}
person.cpp
#include
#include "person.h"
namespace A {
void Person::setName(char *name)
{
this->name = name;
}
int Person::setAge(intage)
{
if (age <0|| age > 150)
{
this->age= 0;
return-1;
}
this->age = age;
return0;
}
void Person::printInfo(void)
{
printf("name =%s, age = %d, work = %s\n",name, age, work);
}
void printVersion(void)
{
printf("Person v1, by weidongshan\n");
}
}
main.cpp
#include
#include "person.h"
#include "dog.h"
int main(intargc,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();
return0;
}
C++命名空间包含了全局命名空间和局部命名空间,全局命名空间写在函数外部,一般在文件开始的地方,在此处使用命名空间全局有效。局部命名空间一般写在函数体内部,在该函数体作用域内有效。
例如:
#include
#include "person.h"
#include "dog.h"
/* global namespace */
/* 把A::Person放入global namespace, 以后可以使用Person来表示A::Person */
using A::Person;
/* 把C::Dog放入global namespace, 以后可以使用Dog来表示C::Dog */
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;
}
还可以直接使用usingnamespace把命名空间全部导入
#include
#include "person.h"
#include "dog.h"
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;
}
3. 输入输出流
C++使用使用iostream实现输入输出
#include
#include "dog.h"
namespace C {
usingnamespacestd;
void Dog::setName(char*name)
{
this->name = name;
}
int Dog::setAge(intage)
{
if (age <0|| age > 20)
{
this->age= 0;
return-1;
}
this->age = age;
return0;
}
void Dog::printInfo(void)
{
cout<<"name = "<
4. 总结
1. C++程序基本结构分为头文件,源文件和主程序
2. #include<>查找头文件时去系统目录查找#include”” 查找头文件优先从程序目录中寻找,如果查找不到再到系统目录中寻找
3. 如果出现函数重名,使用命名空间进行区分
4. 全局命名空间全局有效,局部命名空间局部有效
5. 调用者只用命名命名空间函数的方式:
(1)直接调用 a::fun
(2)using a::fun;一个一个导入
(3)using namespace a;全部导入
6. 使用iostream输入输出