c++基础知识杂记

来源:互联网 发布:ls xgb plc编程软件 编辑:程序博客网 时间:2024/05/16 13:07

发现一直以来写的都是c风格的,后来用oc也是c风格的伪c++代码,搞得c++的基础忘了好多。。

1、声明与定义

一个错误经常遇到吧,“undefined reference to ....”,这里的reference其实就是定义,所以就是未定义的错误。相应的,如果你没有声明一个变量则报的是“undeclared identifier”,undeclared就是未声明的意思。当然,还有一个错误你也会遇到“can't find...”,目前来看这个错误应该是你使用外部函数或变量的时候没有找到,是一种连接时错误,可以叫做找不到...(不过这个错误只是凭印象记下来的,没有特意去验证)。

看有博主说,定义就是一个变量分配存储空间的行为。那么

class a {

private:

 int m_iT;

 }

这里m_it就是一个变量的定义。那么存在成员变量的声明吗?说实话,对于类的普通成员变量我现在还没想到只声明不定义的写法(如果有欢迎指正)。但是,静态成员变量就存在了,如果如下写:

class a {

private:

 static int m_iT;

 }

那么,此处由于并未分配存储空间,个人认为此处是对静态变量的一个声明,而不是定义。因此,静态成员变量也就必须在后来类的外部进行初始化,在这个动作里完成变量空间的分配,完成变量的定义。这个判断的原因在这里可以给出:经过实验,如果一个静态成员变量没有类外的初始化,会报“ undefined reference to 'log::m_bInitialised”错误。

再延伸一点,对于c里面的变量,存在一个外部变量的含义,当你使用一个外部定义的变量时你需要使用extern关键字进行声明,这也是变量声明的一个现象。

成员变量说完了,说下成员函数,其实正常来说,成员函数的定义应该如下:

class Point{ 

private: int m_ix;

     int m_iy;

 public:

    void Set(int a,int b)

            { x=a; y=b; } 

};

也就是在.h头文件里直接写出函数体。但是这不美观也不符合分离的思想,所以一般而言我们见到的是:

class.h中

class Point{ 

private: int m_ix;

     int m_iy;

 public:

    void Set(int a,int b);

};

class.cpp中:

#include "class.h"

void Point::Set(int a, int b) {

x=a;

y=b;

 }

这样也就造成了成员函数的声明和定义分离,在.h头文件中是成员函数的声明,在cpp文件中是其定义。这种写法也叫做成员函数的类外定义。

2、如果定义了如下类:

class a {

public:

void func1();

void func2();

 }

在cpp中定义的时候,如果func1这么写:

void a::func1() {

a::func2();

  func2();

this->func2();

 }

这三行调用有区别吗?个人认为对于普通成员函数,这三者是没什么区别的,由于在a::func1中调用,所以带不带a::没有区别了,而普通成员函数的使用必然会先实例化,所以就会有对象指针this的存在。当然,静态成员函数就不是了,也会报错。

暂时先这些吧,有别的遗忘的到时候再补充。(待续...)




0 0
原创粉丝点击