C++程序结构

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输入输出

 

转载于:https://my.oschina.net/u/3659800/blog/1536124

你可能感兴趣的:(C++程序结构)