一、C++程序到C程序的翻译

程序示例分析:

C++:

class CCar
{
public:
int price;
void SetPrice
(int p);
};
void CCar::SetPrice
(int p)
{ price = p; }
int main() {
CCar car;
car.SetPrice();
return ;
}

C:

struct CCar {
int price;
};
void SetPrice(struct CCar * this,int p)
{ this->price = p; }
int main() {
struct CCar car;
SetPrice( & car,);
return ;
}

拆分

(1)C++

class CCar
{
public:
int price;
void SetPrice
(int p);
};

C

struct CCar {
int price;
};

(2)C++

void CCar::SetPrice
(int p)
{ price = p; }

C

void SetPrice
(struct CCar * this,int p)
{ this->price = p; }

(3)C++

int main() {
CCar car;
car.SetPrice();
return ;
}

C

int main() {
struct CCar car;
SetPrice( & car,);
return ;
}

二、this指针的作用

其作用就是指向成员函数所作用的对象

非静态成员函数中可以直接使用this来代表指向该函数作用的对象的指针。

程序示例分析:

(1)

class Complex {
public:
double real, imag;
void Print() { cout << real << "," << imag ; }
Complex(double r,double i):real(r),imag(i){ }
Complex AddOne() {
this->real ++; //等价于 real ++;
this->Print(); //等价于 Print
return * this;}
};
int main() {
Complex c1(,),c2(,);
c2 = c1.AddOne();
return ;
}

输出:2,1

(2)

class A
{
inti;
public:
void Hello() { cout << "hello" << endl; }
};
int main()
{
A * p = NULL;
p->Hello();
}

输出:hello

拆分:

1)C++

void Hello() { cout << "hello" << endl; }

C

void Hello(A * this ) { cout << "hello" << endl; } 

2)C++

p->Hello();

C

Hello(p);

(3)

class A
{
int i;
public:
void Hello() { cout << i << "hello" << endl; }
};
int main()
{
A * p = NULL;
p->Hello();
}

出错!!!

拆分:

1)C++

p->Hello();

C

Hello(p);

2)C++

void Hello() { cout << i << "hello" << endl; }

C

void Hello(A * this ) { cout << this->i << "hello"<< endl; } 

this为NULL,出错!!

静态成员函数中不能使用 this 指针!

因为静态成员函数并不具体作用与某个对象!

因此,静态成员函数的真实的参数的个数,就是程序中写出的参数个数!

Question:

以下说法不正确的是:

A) 静态成员函数中不能使用this指针

B) this指针就是指向成员函数所作用的对象的指针

C) 每个对象的空间中都存放着一个this指针

D) 类的非静态成员函数,真实的参数比所写的参数多1

答案:C

三、在多个文件中使用类

在有多个文件的C++程序中,如果多个.cpp文件都用到同一个类,可以将类的定义写在一个头文件中,然后在各个.cpp文件中包含该头文件。类的非内联成员函数的函数体只能出现在某一个.cpp文件中,不能放在头文件中被多个.cpp文件包含,否则链接时会发生重复定义的错误。类的内联成员函数的函数体最好写在头文件中,这样编译器在处理内联函数的调用语句时,就能在本文件包含的头文件中找到内联函数的代码,并将这些代码插入调用语句处。内联成员函数放在头文件中被多个.cpp文件包含,不会导致重复定义的错误。

《新标准C++程序设计》3.9-3.10(C++学习笔记11)的更多相关文章

  1. 《新标准C++程序设计》3.8(C++学习笔记10)

    友元 友元分为友元函数和友元类两种. 一.友元函数 在定义一个类的时候,可以把一些函数(包括全局函数和其它类的成员函数)声明为“友元”,这样那些函数就成为该类的友元函数,在友元函数内部就可以访问该类对 ...

  2. 《新标准C++程序设计》4.5(C++学习笔记15)

    实例:长度可变的整型数组类 int main() { //要编写可变长整型数组类,使之能如下使用: CArray a; //开始里的数组是空的 ; i < ; ++i) a.push_back( ...

  3. 《新标准C++程序设计》4.6(C++学习笔记16)

    重载流插入运算符和流提取运算符 流插入运算符:“<<” 流提取运算符:“>>” cout 是在 iostream 中定义的,ostream 类的对象. “<<” 能 ...

  4. 《新标准C++程序设计》4.4(C++学习笔记14)

    运算符重载为友元函数 一般情况下,将运算符重载为类的成员函数,是较好的选择. 但有时,重载为成员函数不能满足使用要求,重载为普通函数,又不能访问类的私有成员,所以需要将运算符重载为友元. class ...

  5. 《新标准C++程序设计》4.1(C++学习笔记12)

    运算符重载的概念和原理 一.运算符重载的需求 C++预定义的“+.-. * ./.%. ^ .&.~.!.|. = .<< >>.!= ”等运算符,只能用于基本数据类型 ...

  6. 《新标准C++程序设计》3.5(C++学习笔记8)

    常量对象和常量成员函数 一.常量对象 如果希望某个对象的值初始化后就再也不被改变,则定义该对象时可以在前面加const关键字,使之成为常量对象. class CDemo { private: int ...

  7. 《新标准C++程序设计》1.7-1.10(C++学习笔记2)

    1.内联函数(inline关键字) eg.inline int Max(int a,int b) { if(a>b) return a; return b; } 当编译器处理调用内联函数的语句时 ...

  8. JavaScript高级程序设计(第三版)学习笔记11、12、17章

    章, DOM扩展 选择符 API Selector API Level1核心方法querySelector .querySelectorAll,兼容的浏览器可以使用 Document,Element  ...

  9. 正确处理类的复合关系------新标准c++程序设计

    假设要编写一个小区养狗管理程序,该程序需要一个“主人”类,还需要一个“狗”类.狗是有主人的,主人也有狗.假定狗只有一个主人,但一个主人可以有最多10条狗.该如何处理“主人”类和“狗”类的关系呢?下面是 ...

随机推荐

  1. swift简介(东拼西凑,看看就的了)

    OpenStack Object Storage(Swift)架构.原理及特性 https://yq.aliyun.com/articles/50262 原文 摘要: 简介 OpenStack Obj ...

  2. postgres登录失败Connection refused与SSL off失败

    连接失败问题 使用postgres数据库连接工具测试,遇到两次失败 第一个登录失败问题 Connection to 192.168.XX.XX:5432 refused. Check that the ...

  3. Mybatis入门(四)配置别名(二)

    这一章我们练习一下Mybatis的别名,这大大的提高了我们的开发效率 类型别名(typeAliases) 类型别名是为 Java 类型设置一个短的名字. 它只和 XML 配置有关,作用在于用来减少类完 ...

  4. eclipse中maven web项目部署时缺少classes文件或者resources文件

    写这篇博客的原因 问题描述 昨天发现eclipse中maven web项目部署时缺少classes文件或者resources文件 本来以为是很常见的原因, 依次检查"Java Build P ...

  5. partialview 用法

    using  MvcApplication1.Models; @model MvcApplication1.Models.UserInfoModel @{     ViewBag.Title = &q ...

  6. springboot2.1mysql驱动类弃用

    Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdb ...

  7. 51nod 1444:破坏道路 广度优先搜索

    1444 破坏道路 题目来源: CodeForces 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  取消关注 在某一个国家,那儿有n个城市,他们通过 ...

  8. 牛客周赛11TG B-弹钢琴

    链接:https://ac.nowcoder.com/acm/contest/941/B来源:牛客网 题目描述 春希想听和纱弹钢琴! 为了阻止异变的发生,Pi将钢琴魔改了 钢琴上有 N 个键,每个键有 ...

  9. css文字实例锦集

    在画布上创建向上的3D拉影文字 <canvas id="myCanvas" width="410" height="130">& ...

  10. 02.swoole学习笔记--UDP服务器

    <?php //创建服务器 $serv=,SWOOLE_PROCESS,SWOOLE_SOCK_UDP); //bool $swoole_server->on(string $event, ...