C++语法疑点
1函数模板不支持偏特化
2类内部的typedef 必须放在最前面,不然没法用:
疑问:为什么类声明处定义的函数体中能出现在后面在声明的成员变量??因为C++对于成员函数函数体的解析是放在整个类声明完毕之后的.
3const vs nonconst member function
注意成员函数的const属性限定并不出现在重载决议中,如果在一个基类中定义了一个成员函数memfunc1(), 然后定义了它的nonconst version
则在派生类里面无论定义一个 const memberfunc1()还是nonconst memberfunc1(),都会覆盖基类的那两个函数,比如下面代码:
class Base{
public:
virtual void sayHello()
{
static int local = 0;
local++;
a = local;
cout << "hello from nonconst"<<endl;
cout << a;
}
virtual void sayHello() const
{
cout << "hello from const" << endl;
}
private:
int a;
};
class Derived:public Base
{
public:
void sayHello()
{
cout << "derived" << endl; //派生类的const 对象再也调用不了sayHello函数了
}
};
关于这一点,可以参考访问控制权限类似的设计,因为名字决议是先于访问控制权限的检查的
4函数返回值并不在name mangling之列,所以从这个角度讲,函数调用也没有达到绝对的类型安全(返回值搞错了的话编译器是检查不出来的)
5 pointer to data member
首先要意识到这是一种指针(可以赋值为nullptr,那样用%d就输出 -1),用printf(%d)输出的就是所指成员变量在类中的偏移
#include<iostream>
using namespace std; class Point3d
{
public:
//virtual ~Point3d(){} //static Point3d origin;
float x;
float y;
float z;
}; struct Base1{int val1;};
struct Base2{int val2;}; struct Derived:Base1, Base2{}; void func1(int Derived::*dmp, Derived* p, const Derived& p2)
{
cout << p->*dmp << endl;
cout << p2.*dmp << endl;
}
int main(int argc, char** argv[])
{
Point3d p;
float Point3d::*p1 = nullptr;
float Point3d::*p2 = &Point3d::x;
if(p1 == p2)
cout << "YES";
printf("%d %d\n", p1, p2);
Derived d1, d2;
d1.val1 = 2, d1.val2 = 3;
d2.val1 = 4, d2.val2 = 5;
func1(&Derived::val1, &d1, d2);
return 0;
}
6关于调用虚函数的开销
区分三种类型:普通对象,引用类型,指针类型
指针不用说,额外增加是间接性很容易理解
引用类型调用函数的格式看起来和对象类型是一致的,但调用虚函数的开销却和指针一样
普通对象调用虚函数就像调用一般的函数一样,没有额外开销
7violatile关键字修饰的作用
被volatile关键字所修饰的变量,只不过是每次使用的时候,都必须从(原始的)(存储变量内容的) 内存 中读取数据,写数据也应该要保证写到内存中去
不允许寄存器优化
8基于函数指针和直接的函数名的调用方式上完全一样:
这完全是为了方便.
还有一点,函数地址和数据地址是两个东西(一个指示代码段,一个指示数据段),所以把void*类型变量赋值成函数指针是错误的做法!
9 In C++, tentative definitions are not supported
10 One difference between C and C++, then, is the relative unimportance of the BSS data segment in C++. All global objects within C++ are treated as initialized.
C++语法疑点的更多相关文章
- 前端笔记之ES678&Webpack&Babel(上)初识ES678&Babel&let和const&解构&语法
一.ES版本简介和调试运行方法 1.1 ECMAScript简介 MDN手册:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript JavaS ...
- 【疑点】js中的break,continue和return到底怎么用?
转: [疑点]js中的break,continue和return到底怎么用? 为什么要说个?好像很简单,但是我也会迷糊,不懂有时候为什么要用return,然而break和continue也经常和他放在 ...
- 我的MYSQL学习心得(一) 简单语法
我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...
- Swift与C#的基础语法比较
背景: 这两天不小心看了一下Swift的基础语法,感觉既然看了,还是写一下笔记,留个痕迹~ 总体而言,感觉Swift是一种前后端多种语言混合的产物~~~ 做为一名.NET阵营人士,少少多多总喜欢通过对 ...
- 探索C#之6.0语法糖剖析
阅读目录: 自动属性默认初始化 自动只读属性默认初始化 表达式为主体的函数 表达式为主体的属性(赋值) 静态类导入 Null条件运算符 字符串格式化 索引初始化 异常过滤器when catch和fin ...
- [C#] 回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性
回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性 序 目前最新的版本是 C# 7.0,VS 的最新版本为 Visual Studio 2017 RC,两者都尚未进入正式阶段.C# 6.0 ...
- Velocity初探小结--velocity使用语法详解
做java开发的朋友一般对JSP是比较熟悉的,大部分人第一次学习开发View层都是使用JSP来进行页面渲染的,我们都知道JSP是可以嵌入java代码的,在远古时代,java程序员甚至在一个jsp页面上 ...
- node.js学习(二)--Node.js控制台(REPL)&&Node.js的基础和语法
1.1.2 Node.js控制台(REPL) Node.js也有自己的虚拟的运行环境:REPL. 我们可以使用它来执行任何的Node.js或者javascript代码.还可以引入模块和使用文件系统. ...
- C#语法糖大汇总
首先需要声明的是"语法糖"这个词绝非贬义词,它可以给我带来方便,是一种便捷的写法,编译器会帮我们做转换:而且可以提高开发编码的效率,在性能上也不会带来损失.这让java开发人员羡慕 ...
随机推荐
- MySQL 函数积累
IFNULL(expr1,expr2) // 如果expr1不是NULL,IFNULL()返回expr1,否则它返回expr2.IFNULL()返回一个数字或字符串值 IF(expr1,expr2,e ...
- Directory.GetCurrentDirectory和Application.StartupPath的区别
System.IO.Directory.GetCurrentDirectory()方法用于获得应用程序当前工作目录.System.Windows.Forms.Application.StartupPa ...
- 35 个免费创新的响应式 HTML5 模板
HTML5 和响应式都是 Web 开发领域中的热门技术,本文向你推荐 35 个免费的响应式 HTML5 模板,将两种技术完美结合. Mori responsive HTML5 Template Res ...
- SQL SERVER数据库索引、外键查找
1.索引查找 select a.name as tabname ,h.name as idname,h.type_descfrom sys.objects as a right join sys.in ...
- [转载]使用SoapUI进行负载测试
使用了SoapUI进行负载测试 http://www.cnblogs.com/zerotest/p/4668918.html 负载测试是相当独特的,我们已经创建了一个功能,使您能够快速创建性能测试,并 ...
- WCF学习笔记
1,关于WCF/web service/WSE Web Service:是行业标准,也就是Web Service 规范,也称作WS-*规范,既不是框架,也不是技术.它有一套完成的规范体系标准,而且在持 ...
- li排序的两种方法
1.一般做法 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <ti ...
- mysql 无法启动1067
关键字:mysql无法启动办事,mysql卡死,InnoDB"" registration as a STORAGE ENGINE failed.Unknown/unsupport ...
- php安装出现的部分错误
在CentOS编译PHP5的时候有时会遇到以下的一些错误信息,基本上都可以通过yum安装相应的库来解决.以下是具体的一些解决办法: checking for BZip2 support… yes ch ...
- Ubuntu用户相关基本命令
Linux是一个用户权限管理得很严格的系统,Ubuntu作为最受欢迎的桌面发行版,提供了简单易用的图形界面工具来管理用户,但是命令行工具往往更强大,用得熟练的话效率会更高.用户管理命令常用的有如下几个 ...